繁体   English   中英

XAML WPF 中 {x:Static} 和 {StaticResource} 的区别

[英]Difference between {x:Static} and {StaticResource} in XAML WPF

WPF 的 XAML 代码中的{x:Static}{StaticResource}什么区别?

例如:

<StackPanel IsEnabled="{Binding Model.IsReadOnly, Converter={StaticResource BoolInverseConverter}}">

<StackPanel IsEnabled="{Binding Model.IsReadOnly, Converter={x:Static BoolInverseConverter}}">

我什么时候应该使用其中一个?

两者都是标记扩展。

x:Static用于引用静态属性,该属性在运行时不会更改。 这适用于枚举、常量、 static属性以及字段。
这意味着您的第二个代码示例是错误的,因为您不能引用类而只能引用属性。 鉴于BoolInverseConverterConverters类的static属性,正确的代码如下所示:

<StackPanel IsEnabled="{Binding Model.IsReadOnly, Converter={x:Static Converters.BoolInverseConverter}}">

StaticResource并不意味着资源在可访问性方面是static ,而是在资源查找方面是static 它是指示 XAML 解析器查找资源树以查找预定义实例的标记扩展。
DynamicResource 唯一的区别是StaticResource指示 XAML 解析器在编译时解析对资源的引用,而DynamicResource让 XAML 解析器创建一个表达式,该表达式将在运行时(延迟)进行评估。 因此, DynamicResource在运行时解析资源。

以下代码片段显示了 XAML 解析器如何通过资源树查找来引用资源(转换器)。 由于使用了 XAML 标记扩展StaticResource ,因此查找是静态的。 这意味着一旦找到资源,就不能被另一个实例替换。 而且,如果在编译时未定义实例,应用程序将崩溃,抛出StaticResourceExtension 如果x:key后面的资源在运行时发生变化,引用将不会更新(静态):

<StackPanel IsEnabled="{Binding Model.IsReadOnly, Converter={StaticResource BoolInverseConverter}}">

下一个代码片段再次显示了 XAML 解析器如何通过资源树查找来引用资源(转换器)。 但是这次使用了DynamicResource标记扩展,使查找变得动态。 这意味着将在运行时查找资源。 并且每次特定x:Key的资源更改时,例如Brush ,引用实例将相应更新(动态):

<StackPanel IsEnabled="{Binding Model.IsReadOnly, Converter={DynamicResource BoolInverseConverter}}">

另一个代码片段显示了如何使用x:static标记扩展引用一个实例,该实例不是资源,而是Converters类中定义的static属性:

<StackPanel IsEnabled="{Binding Model.IsReadOnly, Converter={x:Static Converters.BoolInverseConverter}}">

最后一个代码片段显示了x:Static标记扩展的另一个用例。 这次它用于引用枚举值 ( enum ) 并将Visibility属性设置为Visibility枚举的值:

<StackPanel Visibility="{x:Static Visibility.Collapsed}">

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM