2008-10-07 7 views
2

J'ai un UserControl (contrôle composite) qui peut être montré que le code pseudo XAML suivant:Transfert de dépendance Valeur de la propriété d'un UserControl à un contrôle à l'intérieur

<UserControl> 
    <DockPanel> 
    <TextBox /> 
    <Button /> 
    </DockPanel> 
</UserControl> 

J'utilise ce contrôle personnalisé dans un tas de endroits et style certains d'entre eux avec un style WPF. Ce style définit la propriété Background du contrôle UserControl sur une couleur. Mais cette couleur d'arrière-plan est dessinée sur la surface d'arrière-plan de UserControl, mais je veux qu'elle soit dessinée uniquement sur l'arrière-plan du contrôle TextBox. C'est ce que je reçois (couleur = rouge):

alt text http://img261.imageshack.us/img261/8600/62858047wi3.png

Si je lie la propriété de fond de la UserControl à la propriété d'arrière-plan de mon contrôle TextBox, je suis la suivante:

alt text http://img111.imageshack.us/img111/1637/30765795kw5.png

Maintenant, il peint également l'arrière-plan du contrôle TextBox interne, mais la couleur d'arrière-plan de UserControl existe toujours. Y a-t-il des moyens de supprimer cette peinture de l'arrière-plan de UserControl?

Répondre

5

Il y a un certain nombre de manières de faire ceci, mais je suggérerais d'exposer votre propre propriété sur votre contrôle d'utilisateur et de relier cela à votre contrôle d'utilisateur. Par exemple:

<UserControl x:Name="_root" ...> 
    ... 
    <Button Background="{Binding ButtonBackground, ElementName=_root}"/> 
</UserControl> 

Une autre façon serait tout simplement de définir explicitement la couleur de fond de la TextBox à quelque chose.

1

Je suis d'accord avec Kent. Il existe plusieurs façons de résoudre ce problème.

Mais qu'en est-il simplement d'utiliser un style dans UserControl pour définir l'arrière-plan de la zone de texte? Y a-t-il une raison spéciale que ce qui suit ne fonctionnerait pas pour vous?

<UserControl 
    x:Class="StackOverflowQuestion.UserControl1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="300" 
    Width="300" 
> 
    <UserControl.Resources> 
     <Style x:Key="textBoxStyle" TargetType="{x:Type TextBox}"> 
      <Setter Property="Background" Value="Red"/> 
     </Style> 
    </UserControl.Resources> 
    <DockPanel> 
     <TextBox Text="Test" Style="{StaticResource textBoxStyle}"/> 
     <Button/> 
    </DockPanel> 
</UserControl> 

Si vous voulez vraiment utiliser un ensemble de propriétés sur le contrôle de l'utilisateur et avoir une incidence sur les éléments internes du contrôle de l'utilisateur, je suivrais la suggestion de Kent avec une modification. Je lierais à la place l'arrière-plan du TextBox afin que quel que soit le pinceau d'arrière-plan défini par l'utilisateur sur le contrôle utilisateur serait transmis (l'héritage de valeur de propriété) au bouton. Ou, en d'autres termes, l'arrière-plan de la zone de texte est vraiment ce que vous essayez de faire différent.

<UserControl x:Name="_root" ...> 
    <TextBox Background="{Binding TextBoxBackground, ElementName=_root}"/> 
    <Button/> 
</UserControl>