两者都是标记扩展。
x:Static https://learn.microsoft.com/en-us/dotnet/desktop-wpf/xaml-services/xstatic-markup-extension用于引用静态属性,该属性在运行时不会改变。这适用于枚举、常量、static
属性,还有字段。
这意味着您的第二个代码示例是错误的,因为您不能引用类而只能引用属性。鉴于BoolInverseConverter
is a static
的财产Converters
类,正确的代码如下:
<StackPanel IsEnabled="{Binding Model.IsReadOnly, Converter={x:Static Converters.BoolInverseConverter}}">
StaticResource https://learn.microsoft.com/en-us/dotnet/framework/wpf/advanced/xaml-resources#static-resources并不意味着资源是static
就可访问性而言,而不是在资源查找方面。它是一个标记扩展,指示 XAML 解析器查找资源树以查找预定义实例。
同样的DynamicResource https://learn.microsoft.com/en-us/dotnet/framework/wpf/advanced/xaml-resources#dynamic-resources。唯一的区别是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}}">
另一个代码片段展示了如何引用一个实例,该实例不是资源,而是一个static
中定义的属性Converters
类,使用x:static
标记扩展:
<StackPanel IsEnabled="{Binding Model.IsReadOnly, Converter={x:Static Converters.BoolInverseConverter}}">
最后一个代码片段显示了另一个用例x:Static
标记扩展。这次它用于引用枚举值(enum
)并设置Visibility
属性的值Visibility
枚举:
<StackPanel Visibility="{x:Static Visibility.Collapsed}">