我怀疑这是可能的,但只是想确认一下.
我正在编写一个简单的WPF应用程序,并希望我的样式在外部定义,因此您基本上可以将样式作为外部资源加载.有点像CSS和HTML通常分开...
然而,有一件事让我感到困惑的是,对于HTML和CSS而言,它更像是一种外在的方法,CSS以元素为目标并应用于匹配元素.然而,对于WPF来说,它似乎是另一种方式,你必须告诉元素应该应用哪些样式,但这似乎不是很动态.所以我只想知道是否有一种方法可以应用样式,因此样式只是针对元素.
一个例子是:
<Style TargetType="{x:Type TextBox}" TargetElement="{x:Name SomeTextboxElement}">
<Setter Property="Width" Value="Auto"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
通常你必须指定一个带有样式的键,然后获取要映射到样式键的元素(SomeTextboxElement).
只是显然给每个元素一个样式绑定看起来有点傻了,它应该更加层次化并过滤掉(这可能是,我只是不知道如何)而不是一对一的映射.永远需要为整个应用程序设计风格......
希望有道理......
你所说的你正在寻找的东西很有趣,但不符合 wpf 思维方式,在这种思维方式中,你将样式应用于视觉或视觉类型(意思是:你可以将样式应用于某种类型或定义一个样式作为具有命名键的资源并显式使用该键)。就您而言,我认为创建如下所示的样式应该可以:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Width" Value="Auto"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
这会将您的样式应用于所有文本框,只需省略 TargetElement 属性即可。
我知道这并不完全相同,但如果您想要相同的基本控制样式,只需根据使用情况进行一些更改,您可以尝试使用触发器对其进行较小的更改。我通常使用控件的“标签”属性为我的样式定义提供一些额外的信息。基本按钮样式示例,但有 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>
Run Code Online (Sandbox Code Playgroud)
现在一些假设。如果满足两个条件,您想要的将非常容易实现:
鉴于此,并将其与触发器/多重触发器相结合,您就可以为 ParentVisual.VisualType 创建触发器。
让我们为 WPF 定义一些假设的 CSS,以将样式应用于包含在边框内且 ID 为“subnavi”的网格中包含的任何文本框。
Grid Border#subnavi TextBox
{
backgroundColor:#FF0000;
}
Run Code Online (Sandbox Code Playgroud)
转换为 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>
Run Code Online (Sandbox Code Playgroud)
但不幸的是,没有这样的 DependencyProperties,因此如果您为每个 wpf 控件创建包装器,则只能使用我上面提到的机制。
回到我所说的 WPF 思维方式:WPF 元素由 WPF 引擎设置样式,从相关控件开始,向上而不是向下移动可视化树。我认为 CSS 的工作原理正好相反。
编辑:我认为在我上面写的内容中使用 DependencyObject 类可能比使用 Visual 更明智。