我想在 xaml 中设置带有 int 值的 Tag 属性。但是在资源中定义 int 然后引用该资源作为绑定对我来说看起来不是一个完美的方法。从代码中将 string 值转换为 int 更容易。 那么,有没有办法在xaml中轻松设置int值?
请尝试这个。
在 xaml 中添加命名空间 xmlns:sys="clr-namespace:System; assembly=mscorlib"
<sys:Int16 x:Key="IntNo">1</sys:Int16> or
<sys:Int32 x:Key="IntNo1" >1</sys:Int32>
注意:同样,您也可以用于双值。
如果对将其声明为资源不感兴趣,您可以内嵌声明它,有点像这样:
<Button>
<Button.Tag>
<sys:Int32>5</sys:Int32>
</Button.Tag>
</Button>
xmlns:sys="clr-namespace:System;assembly=mscorlib"
<Grid>
<Grid.Resources>
<sys:Int32 x:Key="IntValue" >1</sys:Int32>
</Grid.Resources>
<Button x:Name="Button" Tag="{StaticResource IntValue}"></Button>
</Grid>
够简单吗?如果您要在多个地方使用您的值,上面的示例将是合适的。否则:
<Button x:Name="Button" >
<Button.Tag>
<sys:Int32>1</sys:Int32>
</Button.Tag>
</Button>
在 XAML 2009 中,您可以简单地使用
"x"
前缀,例如 x:Boolean
、x:Decimal
或 x:Int32
。
请参阅 Microsoft - 常见 XAML 语言原语的内置类型
示例:
此示例来自 WinUI 3 应用程序(WinUI 3 XAML 与 UWP XAML 非常相似,并且与 WPF XAML 大部分相似)
<Window
x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="MyApp"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid>
<Button x:Name="MyButton" Click="MyButton_Click" Content="Print 'Tag' value to console">
<Button.Tag>
<x:Int32>42</x:Int32>
</Button.Tag>
</Button>
</Grid>
</Window>
背后代码:
private void MyButton_Click(object sender, RoutedEventArgs e)
{
int value = (int) MyButton.Tag;
Debug.WriteLine(value);
}
您还可以指定一个接受
int
的命令参数:
<Button Command="{x:Bind ViewModel.AddMinutesCommand}" Content="+ 30 Minutes">
<Button.CommandParameter>
<x:Int32>30</x:Int32>
</Button.CommandParameter>
</Button>
对于 XAML 2009 在各种技术中的可用性似乎存在一些困惑:Stackoverflow - Can XAML 2009 相关的标记扩展可以在 WPF 中使用吗?
老实说,我也不明白为什么我的工作示例代码只能使用
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml
作为 x
命名空间
而不必在这里指定类似 2009/xaml
的内容。
如果您能澄清这一点,请随意更改此答案。
您可以创建自定义
MarkupExtension
来实现所需的内联行为。
[MarkupExtensionReturnType(typeof(int))]
public class IntExtension : MarkupExtension
{
public IntExtension(int value)
{
Value = value;
}
[ConstructorArgument("value")]
public int Value { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
return Value;
}
}
那么就这么简单:
<Button Command="{Binding MyCommand}" CommandParameter="{local:Int 5}">