看待这个问题的方法是:如何使组合框使用不同于其他UI的文本框样式?
答案是:创建应用其他样式的附加属性,然后使用组合框样式应用附加属性。
首先是组合框样式,这样您就可以看到它的走向:
<Style TargetType="ComboBox">
<Setter Property="local:MyCustomStyler.Style1">
<Setter.Value>
<Style TargetType="TextBox">
<Setter Property="Background" Value="Black" />
</Style>
</Setter.Value>
</Setter>
</Style>
现在您需要定义MyCustomStyler类,如下所示:
public class MyCustomStyler
{
public static Style GetStyle1(DependencyObject obj) { return (Style)obj.GetValue(Style1Property); }
public static void SetStyle1(DependencyObject obj, Style value) { obj.SetValue(Style1Property, value); }
public static readonly DependencyProperty Style1Property = DependencyProperty.RegisterAttached("Style1", typeof(Style), typeof(MyCustomStyler), new PropertyMetadata
{
PropertyChangedCallback = (obj, e) =>
{
var element = obj as FrameworkElement;
var style = e.NewValue as Style;
element.Resources[style.TargetType] = style;
}
});
}
其工作方式是,每次在FrameworkElement(如组合框)上设置附加的Style1属性时,它都会在默认键下将样式添加到资源中。因此,无论何时将上述样式应用于组合框,内部文本框样式都将添加到组合框的资源中,从而使文本框获得此样式。
从这里可以很简单地实现您想要的:只需在App.xaml中将ComboBox样式与自定义的TextBox样式放在一起,就完成了。