8
votes

Wpf mélange lié et texte fixe dans une zone de texte

J'ai le code suivant pour afficher un âge des clients. xxx

Cependant, au lieu d'afficher juste le numéro, je veux le préfixer avec le texte "Âge" et le suffixer avec Le texte "YRS" de sorte qu'il devient efficacement "36 ans"

Je peux y parvenir avec un stackPanel horizontal et 3 textes de texte, mais y a-t-il une méthode beaucoup plus simple qui me manque?


3 commentaires

Voulez-vous des pièces "Âge" et "YRS" pour être éditable? C'est à dire. Si l'utilisateur devrait-il être autorisé à taper "40 ans" (ou peut-être aussi simplement "40") dans la zone de texte dans son intégralité, et l'avoir analysé correctement?


Dans tous les cas, si vous n'avez qu'une seule zone de texte de ce type dans votre application (c'est-à-dire non nécessaire pour qu'elle soit réutilisable), la solution StackPanel + 2 TextBlocks + Solution TextBox va être la plus simple.


Il suffit d'être utilisé comme réadonn, aucune mise à jour requise.


4 Réponses :


5
votes

Vous pouvez créer une propriété dans la classe que vous souhaitez également créer la chaîne de texte que vous souhaitez afficher.

Il y a aussi la route StringFormat: P>

<textblock text="{Binding Path=mydate, StringFormat=d}"/>


3 commentaires

Cela modifie essentiellement votre modèle pour être sensibilisé - une très mauvaise idée du point de vue de la conception.


+1 pour strindformat. D'accord avec @pavel - Ne créez pas une propriété avec ce texte.


Si vous voulez vraiment faire cela correctement, le texte n'appartient pas non plus à la vue. Il doit être dans une zone de ressources sélectionnée par la couche de présentation en fonction de votre réglage de la culture actuelle. C'est pourquoi tous mes trucs proviennent des propriétés du présentateur.



9
votes

En supposant que vous n'avez pas besoin de la valeur de l'âge pour être modifiable, dans WPF 4.0 La propriété Text of Run sera obligatoire, cela ne vous aide probablement pas maintenant à moins que vous n'utilisez la pré-version, mais vous pourrez Pour faire quelque chose comme ce qui suit: xxx

update Heres Une autre alternative à la solution de chaîne de format qui fonctionnera mais n'est pas particulièrement jolie (en fait son assez haçonneux). Utilisez le convertisseur suivant sur la liaison (en supposant que la propriété cliente est de type INT): xxx


3 commentaires

Merci Simon, c'était le genre de chose que je cherchais mais comme vous le dites, ce n'est pas encore avec nous! Je serais peut-être à adopter une approche longue de longue durée jusqu'à ce que WPF 4.0 soit avec nous.


Beau bit de compagnon de pensée latérale. Je profite actuellement d'utiliser des convertisseurs pour toutes sortes de choses afin que votre approche appelle vraiment. Merci pour ça!


Oui, le convertback est la partie que je n'aime pas, mais depuis sa situation réadonnée qui ne sera pas un problème.



6
votes

C'est une question assez ancienne, mais je pense que c'est la meilleure solution actuelle (si vous souhaitez modifier le texte).

Vous pouvez le faire avec un inineUicontainer code> dans un TextBlock code> avec une zone de texte imbriquée code>. P>

Remarque: j'ai utilisé baselinealignment = "Centre" code> pour aligner les composants. Vous pouvez également ajouter des marges positives ou négatives à la zone code> code> si nécessaire. J'ai aussi défini la bordure de la zone de texte code> comme transparent pour qu'il ressemble à une partie du texte textblock code> même s'il est modifiable et sélectionnable. P>

<TextBlock Foreground="SteelBlue">
    <Run Text="Package Barcode:" FontWeight="Bold" BaselineAlignment="Center"/>
    <InlineUIContainer BaselineAlignment="Center">
        <TextBox Margin="2,0,0,0" Foreground="Gray" Text="{Binding BarcodeNumber}" BorderThickness="0" Padding="0"/>
    </InlineUIContainer>
</TextBlock>


2 commentaires

Oui, je me rends compte que le questionneur original souhaitait finalement que l'âge est en lecture seule - mais c'est une réponse à la question qui lui est demandé :-)


C'est une vieille réponse.



1
votes

Ceci est comme une réponse précédente - (mais ils sont tous avec Texblocks ... Voici donc une version de Textbox), je souhaitais également montrer l'approche multiples. Pour obtenir une Texbox pour faire ce que vous voulez, vous pouvez utiliser le code suivant: xxx

Il peut être utile si vous souhaitez que votre texte soit sélectionnable, un utilisateur puisse copier le code.


0 commentaires