2013-08-25 54 views
9

mục tiêu của tôi là để ràng buộc Content -Property của Label đến Tag -Property của Elements Style được áp dụng cho. Nhưng giải pháp của tôi dường như không làm việc:WPF - RelativeSource trong Phong cách


phong cách của tôi:

<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> 

textbox của tôi:

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

Trả lời

7

Nếu tôi hiểu đúng, bạn muốn thiết lập các văn bản cho VisualBrush , sẽ được hiển thị trong TextBox.

Bạn có thể làm điều đó như thế này:

<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> 

Để giải thích tại sao ví dụ của bạn không kiếm được:

1. Như bạn có thể hiểu được, nhìn vào ví dụ của tôi, RelativeSource phải không tự, trong trường hợp này nó sẽ trỏ đến chính nó (VisualBrush) và phần tử có loại phải là TextBox, nằm cao hơn trong cây trực quan.

2. Ràng buộc với RelativeSource không hoạt động trong các nguồn lực, vì Resource không phải là một phần của cây thị giác, hoặc một phần của mẫu.

3. Trong phong cách xây dựng này sẽ không làm việc, bởi vì Style chỉ là tập hợp các setters, ông không biết về việc kiểm soát, là ở đó. Vì mục đích này, thường sử dụng DataTemplate hoặc ControlTemplate.

Thay vào đó, trong trường hợp này, tôi khuyên bạn nên sử dụng mẫu cho số TextBox, sẽ được đăng ký VisualBrush.

Dưới đây là ví dụ của tôi:

<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