WPF - Passer la valeur d'un contrôle à un convertisseur pour définir la largeur sur un autre contrôle
Je veux définir la largeur d'un TextBlock en fonction de la largeur de son conteneur, moins les marges sur le TextBlock.
Voici mon code
<TextBlock x:Name="txtStatusMessages"
Width="{Binding ElementName=LayoutRoot,Path=ActualWidth }"
TextWrapping="WrapWithOverflow"
Foreground="White"
Margin="5,5,5,5">This is a message
</TextBlock>
Et qui fonctionne très bien, sauf pour le fait que le TextBlock est de 10 unités trop grande en raison de Marges Gauche et Droite bbeing 5.
OK, alors j'ai pensé que... nous allons utiliser un Convertisseur. Mais je ne sais pas comment passer le ActualWidth de mon conteneur de contrôle (VOIR ci-DESSUS: LayoutRoot).
Je sais comment utiliser les convertisseurs, et même de les convertisseurs avec les paramètres, pas juste un paramètre comme la... Binding ElementName=LayoutRoot,Path=ActualWidth
Par exemple, je ne peux pas faire ce travail...
Width="{Binding Converter={StaticResource PositionConverter},
ConverterParameter={Binding ElementName=LayoutRoot,Path=ActualWidth }}"
J'espère que j'ai fait ce assez clair et j'espère que vous pouvez aider parce que Google n'est d'aucune aide pour moi ce soir.
TIA!
Doug
source d'informationauteur Doug
Vous devez vous connecter pour publier un commentaire.
vous êtes supposé utiliser l'autre comme la source, pas le paramètre.
Le paramètre doit être une constante, et dans votre cas peut-être de -5.
Je ne suis pas près de VS en ce moment, donc la syntaxe inexactes peut-être, cependant, il est quelque chose comme:
(Le convertisseur recevrez -5 comme une chaîne de caractères et devrez le convertir en un certain nombre avant de l'utiliser.)
De mon expérience, il est préférable d'utiliser le OnXXXChanged rappel de DependecyProperty XXX, et de ne pas lier des contrôles à l'intérieur de la même fenêtre/racine de contrôle de l'un à l'autre.
L'une des raisons pour cela est que vous pouvez les lier à un élément extérieur plus tard.
Ou à défaut, utilisez multibinding:
et et un convertisseur qui convertit les deux paramètres à la valeur que vous souhaitez.
oui..multi liaison fonctionne pour moi.. en fait j'ai essayé d'envoyer un élément comme un convereterparameter, mais ce n'est pas de l'accepter. c'est pourquoi j'ai passé l'élément comme une valeur de la classe du convertisseur.
ci-dessous est mon exemple..
Dans la fenêtre de redimensionnement, mon premier gridviewcolumn doit être redimensionné, pas les deux autres gridviewcolumns..
j'ai passé Actualwidth de la listview et aussi total gridview objet comme un élément..
si vous allez le convertisseur de code...
cela a fonctionné pour moi... 🙂
Bien que je pense qu'il y peut-être une meilleure façon de résoudre votre problème, je pense que j'ai une réponse pour ce que vous voulez faire. ( Vous n'avez pas mentionné ce type de votre conteneur. Un StackPanel par exemple, prend en charge le calcul de la largeur pour vous. Voir la zone de texte n ° 2 ci-dessous)
D'abord le code XAML
Suivant le Convertisseur. Nous avons un problème ici.. depuis le ConverterParameter pour le Convertir méthodes ne peuvent pas être d'une valeur dynamique pour une raison quelconque. Afin de nous faufiler dans la zone de texte de la Marge par l'intermédiaire d'une propriété publique de l'Convertisseur que nous avons définies dans la Fenêtre de ctor.
WidthSansMarginConverter.cs
Window2.xaml.cs
HTH. Merci pour l'exercice 🙂
Si votre zone de texte est un enfant direct de LayoutRoot, il suffit de définir la propriété suivante dans votre zone de texte
Selon http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/7298ceb5-bf56-47aa-a161-5dd99189408bvous pouvez ajouter une propriété de Dépendance à votre convertisseur personnalisé si votre convertisseur est dérivé de DependencyObject.
Dans ce cas, vous pouvez même utiliser la liaison de données pour transmettre des valeurs de ces propriétés permet de définir le convertisseur (dans le dictionnaire de ressources) dans le code XAML.