问题描述
问题:在jquery中,我们使用class selector选择某些元素,然后更改这些元素的属性(颜色,大小,文本等)。 WPF
中是否有类似内容?
动机:在某些情况下,我们在WPF窗口(或页面)上对所有TextChanged(...)
使用相同的MyTextBoxes_TextChanged(object sender,TextChangedEventArgs e)
事件,例如TextBoxes
。但是,如果我们不希望只对某些TextBoxes
使用同一事件,怎么办?
解决方法
在wpf中进行等效操作的方法是在元素上显式设置样式。
您给样式赋予关键点:
<Window.Resources>
<Style x:Key="ExplicitStyle" TargetType="TextBox">
<Setter .....
然后在特定的文本框中引用它:
<TextBox Style="{StaticResourece ExplicitStyle}"
样式是WPF中的依赖项属性,这意味着它只能具有一个值,表示没有级联的直接等效项。
您可以使用BasedOn从另一种样式继承
<Style x:Key="ExtendedStyle" BasedOn="ExplicitStyle"
没有键或与控件类型相同的样式是应用于该类型所有控件的默认样式。
您可能还需要考虑其他机制。
例如,事件通常是路由事件,这些事件发生隧道和冒泡。这意味着您可以在父级别(例如说窗口)处理特定类型的所有未处理事件。
资源具有作用域,因此您可以在较低的作用域中以具有匹配键和不同设置的样式进行合并,并覆盖父项。
也值得一提的是数据模板化。通常会基于数据构建UI,而不是像使用MVC那样创建UI并为其提供模型。 当然,用户控件或从数据模板创建的xaml块也可以设置自己的样式和值。
CSS(尤其是mixins)更灵活,但在其他方面wpf得分更高。
顺便说一句。 您提到了Page。
通常使用UserControls而不是Page(s),除非您要构建“向导”风格的流程,使用户在输入或XBAP的几个步骤中循环。原因是Frame和Page占用了内存开销,而ContentControl和UserControl却没有。您不必也不必在contentcontrol上设置导航按钮的样式。