将字符串定义为静态资源

31

是否有一种方法可以定义一个常量字符串,并在整个应用程序中作为静态资源使用?

我正在运行一个Wpf应用程序,但没有主xaml表单。该应用程序是由单个经典的.cs表单处理的多个xaml控件的集合。

4个回答

90

您可以将其定义为应用程序资源:

 <Application x:Class="xxxxxx"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:clr="clr-namespace:System;assembly=mscorlib"
                 StartupUri="MainWindow.xaml">
        <Application.Resources>
            <clr:String x:Key="MyConstString">My string</clr:String>
        </Application.Resources>
    </Application>

我们在这方面有不同的方法,我想知道你对我的方法有什么看法?我通常会将所有资源放入单独的字典文件中,以提高可读性(将所有内容放在Application.Resources中可能会导致代码非常混乱),但这样做是否会影响性能呢? - Damascus
1
@Damascus:也许拥有一个独立的字典是一个更好的方法。我认为这没有明显的性能差异,但从未尝试过比较:也许忽略这个微小的优化。 - Felice Pollano
这是理想情况,但是我没有一个 Application.xaml 文件,只有一系列的用户控件,所以这种方式在我这种情况下不适用。 - Marcom
@Marcom 好的,那么大概Damascus的回复适合你。 - Felice Pollano
4
请注意,您可以使用<x:Static Member="clr:String.Empty" />来声明一个空字符串。 - Yogu

15

补充一下 FelicePollano的回答 - 为了使代码缩进生效,我将其作为一个单独的“答案”。

如果你恰好将原始常量定义在.cs文件中,那么可以通过以下方式避免在<Application.Resources>中重复定义它的值:

<x:Static x:Key="MyConstString" Member="local:Constants.MyString" />

要使上面的引用local起作用,您需要在标签<Application>中包含命名空间xmlns:local="clr-namespace:Utils"

cs-class可以如下所示:

namespace Utils 
{
    public class Constants
    {
        public const string MyString = "My string";
    }
}

在xaml代码中使用的示例可以是:

<TextBlock Text="{StaticResource MyConstString}" />

1
我最喜欢这个。它允许为字符串提供单个定义,可以从XAML和C#中使用,而无需让XAML了解代码(在资源定义之外)。 - dlf
1
双引号缺失。 <x:Static x:Key="MyConstString" Member="local:Constants.MyString" /> - sa.he
使用此方法,我收到以下错误: 无法将类型为“System.Windows.Markup.StaticExtension”的对象应用于期望类型为“System.String”的属性。这个解决方案真的有效吗? - Daniel Möller

7

只需添加一个资源字典 XAML 文件,比如说它的名字是 Dictionary.xaml (Visual Studio 可以自动创建)。

然后,在这个字典中添加你的静态资源。

最后,在所有的 XAML 控件中引用这个字典:

<UserControl.Resources>
                <ResourceDictionary Source="Dictionary.xaml"/>
    </UserControl.Resources>

尽管如果你有很多控件的话它可能会有点繁琐,但它工作得很好。 - Marcom
我认为即使你有很多控件,它也不会很重:对于你的解决方案中的每个控件,只需添加三行代码,这尤其有助于更轻松地理解你的代码(例如,我的解决方案中有许多不同的字典:一个用于转换器,一个用于模板,一个用于动画...这帮助我非常容易地找到我想要的)。但是当然,如果你只有一个共享资源,那么它会感觉很沉重。 - Damascus

5
您可以像这样使用:
首先,定义一个常量变量:
namespace Constants
{
    public class ControlNames
    {
        public const string WrapperGridName = "WrapperGrid";
    }
}

第二个使用XAML的例子:

<TextBlock Text="{x:Static Member=Constants:ControlNames.WrapperGridName}"

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