gpt4 book ai didi

wpf - {x :Static} and {StaticResource} in XAML WPF 之间的差异

转载 作者:行者123 更新时间:2023-12-04 16:27:23 25 4
gpt4 key购买 nike

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

例如:

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


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

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

最佳答案

两者都是标记扩展。

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

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

StaticResource 不代表资源是 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}}">

另一个代码片段展示了如何引用一个实例,它不是一个资源,而是一个 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}">

关于wpf - {x :Static} and {StaticResource} in XAML WPF 之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60754206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com