我有一个用户控件(复合控件),可以显示为以下伪 XAML 代码:
<UserControl>
<DockPanel>
<TextBox />
<Button />
</DockPanel>
</UserControl>
我在很多地方使用此自定义控件,并使用 WPF 样式设置其中一些控件的样式。此样式将用户控件的背景属性设置为一种颜色。但是此背景颜色是在用户控件的背景图面上绘制的,但我希望它只绘制在文本框控件的背景上。这是我得到的(颜色=红色):
可选文字 http://img261.imageshack.us/img261/8600/62858047wi3.png
如果我将用户控件的背景属性绑定到文本框控件的背景属性,我会得到以下属性:
替代文本 http://img111.imageshack.us/img111/1637/30765795kw5.png
现在,它还绘制内部文本框控件的背景,但用户控件的背景色仍然存在。有没有办法删除用户控制背景的绘画?
方法可以做到这一点,但我建议在用户控件上公开您自己的属性,并将其绑定到用户控件中的属性。例如:
<UserControl x:Name="_root" ...>
...
<Button Background="{Binding ButtonBackground, ElementName=_root}"/>
</UserControl>
另一种方法是将TextBox
的背景颜色显式设置为某些内容。
我同意肯特的观点。有多种方法可以解决此问题。
但是,仅使用用户控件中的样式来设置文本框的背景呢?是否有任何特殊原因导致以下内容对您不起作用?
<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>
如果您确实想利用在用户控件上设置的属性并让它影响用户控件的内部,我会按照 Kent 的建议进行一次修改。我将绑定文本框的背景,以便用户在用户控件上设置的任何背景画笔都将(属性值继承)流向按钮。或者,换句话说,文本框的背景实际上是您要做出的不同之处。
<UserControl x:Name="_root" ...>
<TextBox Background="{Binding TextBoxBackground, ElementName=_root}"/>
<Button/>
</UserControl>