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