我想知道如何在 xaml 中将本地 int 变量的值设置为 Int.MaxValue (在我的例子中位于 ResourceDictionary 中)。
类似的东西:(但有用的东西:))
xmlns:s="clr-命名空间:系统;程序集=mscorlib
<s:Int32 x:Key"HelloWorld">{x:Static s:Int.MaxValue}</s:Int32>
Run Code Online (Sandbox Code Playgroud)
编辑:
@伊恩:
谢谢:) 但是我如何将静态资源用作 int 呢?假设我的 ResourceDictionary 中有
<ResourceDictionary>
<x:Static
x:Key="HelloWorld"
Member="s:Int32.MaxValue"
/>
...
<blablalba TooltipService.ShowDuration="{StaticResource HelloWorld}"/>` <-- this does not work by the way
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
这应该可以做到:
<x:Static
x:Key="HelloWorld"
Member="s:Int32.MaxValue"
/>
Run Code Online (Sandbox Code Playgroud)
为了防止不清楚这里实际发生了什么,它使用了一个很多人不知道的方便技巧:虽然像这样的标记扩展通常x:Static用在大括号 ({}) 内的属性中,但您也可以使用元素语法他们。这在您想要使用标记扩展但 Xaml 语法需要一个元素的情况下非常有用。(在涉及集合的场景中,这一点通常是必要的,就像这样。)
使用元素语法进行标记扩展的一个小问题是您不再可以传递构造函数参数。(从技术上讲,构造函数参数支持是在 XAML 2009 中引入的,自 .NET 4 起就受到支持。但是,只有通过新的 Xaml API 加载 Xaml 时才受支持。MSDN 文档表示不支持新的 XAML 2009 功能因此,您只能将此技巧与提供默认构造函数的标记扩展一起使用,并且提供可用来代替构造函数参数的属性。它StaticExtension提供了一个Member可以实现这一目的的属性,因此我们在这里没问题,但请注意,有时,您会由于无法调用适当的构造函数而陷入困境。
请注意,当您键入此内容时,Visual Studio 中的 Xaml IntelliSense 可能会建议StaticExtension,这是此标记扩展的真实名称。当您使用属性语法时,它会省略该Extension部分,但对于元素,由于某种原因,它似乎不会。不过,这两种形式都是正确的 - 我会采用我在这里写的内容,而不是 IntelliSense 建议的内容,因为我们更习惯于"{x:Static ...}"在属性中查看"{x:StaticExtension ...}"- 再说一遍,两者都是合法的,但惯用的方式是,我们倾向于忽略Extension。