您所说的内容很有趣,但不符合wpf的思维方式。在wpf中,您可以将样式应用于可视化元素或可视化元素的类型(即:您可以将样式应用于某种类型,或者定义一个具有命名键的资源样式,并明确使用该键)。对于您的情况,我认为创建以下样式应该就可以:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Width" Value="Auto"/>
</Style>
这会将你的样式应用于所有文本框,只需省略TargetElement属性。
我知道这不完全相同,但如果您想要相同的基本控件样式,只需根据使用情况进行一些小改变,您可以尝试使用触发器对其进行微小更改。 我通常使用我的控件的“Tag”属性为样式定义提供一些额外的信息。 以下是一个基本按钮样式示例,但有3个按钮:
<Style.Triggers>
<Trigger Property="Tag" Value="delete">
<Setter Property="Background" Value="Red"></Setter>
</Trigger>
<Trigger Property="Tag" Value="confirm">
<Setter Property="Background" Value="Green"></Setter>
</Trigger>
</Style.Triggers>
现在有一些假设。如果满足以下两个条件,您想要的将非常容易实现:
- 所有WPF可视化元素都有一个名为“ParentVisual”的DependencyProperty,返回直接包含该可视化元素的可视化元素。
- 所有WPF可视化元素都有一个DepencyProperty,例如“VisualType”
如果满足以上条件,并结合触发器/多触发器,则可以创建针对ParentVisual.VisualType的触发器。
让我们定义一些假想的CSS样式,以便WPF将其应用于包含在网格中的ID为“subnavi”的边框内的任何TextBox。
Grid Border#subnavi TextBox
{
backgroundColor:#FF0000;
}
在 WPF 中进行翻译,这将是一个具有三个条件的 TextBox 的多触发器:
<MultiTrigger>
<Condition Property="ParentVisual.VisualType" Value="Border"></Condition>
<Condition Property="ParentVisual.Name" Value="subnavi"></Condition>
<Condition Property="ParentVisual.ParentVisual.VisualType" Value="Grid"></Condition>
<Setter Property="Background" Value="Red"/>
</MultiTrigger>
不幸的是,没有这样的DependencyProperties,因此如果您为每个wpf控件创建包装器,那么您只能使用我上面提到的机制。
回到我所说的WPF思维方式:WPF元素通过WPF引擎沿着可视化树向上(而不是向下)进行样式设置,从问题控件开始。我认为CSS是相反的。
编辑:我认为在上面写的内容中使用DependencyObject类可能更加明智,而不是使用Visual。