有没有一种简单的方法在XAML中指定int值?

14

我想在XAML中设置标签属性为整数值。但是,在资源中定义整数,然后将该资源作为绑定引用似乎不是一种完美的方式。更简单的方法是从代码中将字符串值转换为整数。 因此,有没有一些简单的方法来在XAML中设置整数值呢?

4个回答

21

请尝试这个。

在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>
注意:同样的方法也适用于双精度值

对于当前的.NET运行时,命名空间已更改为xmlns:sys="clr-namespace:System;assembly=System.Runtime"。 - MarkusParker

13

如果不想将它声明为资源,您可以像这样在行内声明

    <Button>
        <Button.Tag>
            <sys:Int32>5</sys:Int32>
        </Button.Tag>
    </Button>

2
很不幸,这段文字太长了。 我需要为几个元素设置标签,例如Tag="int:0"Tag="int:1"等等。 - arteny
Tag 属性是 object 类型。即使您想从代码后台访问它,也必须进行类型转换 (int)button.Tag。您能说出其使用情况吗? - Rohit Vats
2
是的,但是(int)button.Tag比int.Parse((string)button.Tag)更简单 :) 好的,我理解使用字符串值是最简单的方法。 - arteny
是的,在XAML中没有其他方法。或者使用资源也对我来说很好。 - Rohit Vats
@Arteny - 无论哪种方法,您都可以创建一个静态扩展方法来获取标记属性并将其转换为int。例如:public static int TagAsInt(this YourBaseElementClass e) { return (int)e.Tag; }。然后使用非常简单,只需调用 myElement.TagAsInt() 即可。如果将Tag定义为字符串更容易,您只需更改该方法以执行解析,并完全相同地使用它。 - ToolmakerSteve
这更像是“四行代码”。 - Pawcio

10
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>

2
在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-related markup extensions be used in WPF? 老实说,我也不理解为什么我的工作示例代码只需使用xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml就可以为x命名空间指定而不必在此处指定2009/xaml之类的内容。
如果您能澄清这一点,请随意更改此答案。

这个答案比其他答案更新得多。适用于UWP和WinUI3,感谢分享! - AtosNicoS

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接