2013-08-25 3 views
9

Mein Ziel ist es, dem Inhalt -Property des Label- zum Tag -Property der Elemente zu binden, um den Stil zu angewendet wird. Aber meine Lösung nicht zu funktionieren scheint:WPF - Relative in Stil


Mein Stil:

<Style 
    TargetType="TextBox" 
    x:Key="HintedTextBox"> 
    <Style.Resources> 
     <VisualBrush 
     AlignmentX="Left" 
     AlignmentY="Center" 
     Stretch="None" 
     x:Key="HintedTextBox_Hint"> 
     <VisualBrush.Visual> 
      <Label 
       Content="{Binding RelativeSource={RelativeSource Self}, Path=Tag}" 
       Foreground="LightGray" /> 
     </VisualBrush.Visual> 
     </VisualBrush> 
    </Style.Resources> 
    <!-- Triggers --> 
</Style> 

Meine Textbox:

<TextBox 
    Style="{StaticResource ResourceKey=HintedTextBox}" 
    x:Name="tbTest" /> 

Antwort

7

Wenn ich richtig verstehe, wollen Sie den Text setzen für VisualBrush , die im TextBox angezeigt werden.

Sie können es wie folgt tun:

<TextBox Name="MyTextBox" Tag="MyNewValue" Width="100" Height="25"> 
    <TextBox.Background> 
     <VisualBrush AlignmentX="Left" AlignmentY="Center" Stretch="None"> 
      <VisualBrush.Visual> 
       <Label Content="{Binding RelativeSource={RelativeSource AncestorType=TextBox}, Path=Tag}" Foreground="LightGray" /> 
      </VisualBrush.Visual> 
     </VisualBrush> 
    </TextBox.Background> 
</TextBox> 

Um zu erklären, warum Ihr Beispiel nicht verdient:

1. Wie Sie wahrscheinlich verstehen, an meinem Beispiel suchen, RelativeSourcesein darf nicht Selbst, in diesem Fall wird es auf sich selbst zeigen (VisualBrush), und das Element mit dem Typ muss von TextBox sein, höher im visuellen Baum.

2. mit RelativeSource Bindung funktioniert nicht in Ressourcen, weil die Resource nicht Teil der visuellen Struktur ist, oder ein Teil der Vorlage.

3. In Stile dieser Konstruktion wird nicht funktionieren, weil die Style nur die Sammlung von Setter ist er über die Kontrolle nicht wissen, gibt es. Zu diesem Zweck wird üblicherweise DataTemplate oder ControlTemplate verwendet.

Als Alternative, in diesem Fall, empfehle ich eine Vorlage für die TextBox, die VisualBrush registriert werden wird.

Unten ist mein Beispiel:

<Window.Resources>    
    <Style TargetType="{x:Type TextBox}"> 
     <Setter Property="SnapsToDevicePixels" Value="True" /> 
     <Setter Property="OverridesDefaultStyle" Value="True" /> 
     <Setter Property="KeyboardNavigation.TabNavigation" Value="None" /> 
     <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
     <Setter Property="MinWidth" Value="120" /> 
     <Setter Property="MinHeight" Value="20" /> 
     <Setter Property="AllowDrop" Value="true" /> 

     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type TextBoxBase}"> 
        <Border Name="Border" CornerRadius="0" Padding="2" BorderThickness="1" BorderBrush="Black"> 
         <Border.Background> 
          <VisualBrush AlignmentX="Left" AlignmentY="Center" Stretch="None"> 
           <VisualBrush.Visual> 
            <Label Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Tag}" 
              Foreground="LightGray" /> 
           </VisualBrush.Visual> 
          </VisualBrush> 
         </Border.Background> 

         <ScrollViewer Margin="0" x:Name="PART_ContentHost" /> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 

<Grid> 
    <TextBox Name="MyTextBox" Tag="MyNewValue" Width="100" Height="25" />   
</Grid> 

Output

enter image description here