【问题标题】:Define a string as a static resource将字符串定义为静态资源
【发布时间】:2011-04-14 09:30:39
【问题描述】:

有没有办法定义一个常量字符串作为整个应用程序的静态资源?

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

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

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

     <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:也许有一个单独的字典是更好的方法。我不认为有明显的性能差异,但从未尝试过比较:可能是一个可以忽略的微小优化。
    • 这将是理想的,但正如我所说,我没有 application.xaml 只有一个 usercontols 集合,所以这在我的情况下不起作用
    • @Marcom 好的,所以大马士革的回复可能适合你
    • 注意可以使用&lt;x:Static Member="clr:String.Empty" /&gt;声明空字符串
    【解决方案2】:

    answer by @FelicePollano 的补充 - 为了让代码缩进起作用,我将其作为单独的“答案”。

    如果您碰巧在 .cs 文件中定义了原始常量,则可以通过以下方式避免在 &lt;Application.Resources&gt; 中重复其值:

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

    要使上面的引用“本地”起作用,您需要在标签&lt;Application&gt; 中包含命名空间xmlns:local=”clr-namespace:Utils”

    cs 类可能如下所示:

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

    xaml 代码中的用法示例如下:

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

    【讨论】:

    • 我最喜欢这个。它允许对可以从 XAML 和 C# 使用的字符串进行单一定义,而 XAML 不需要了解代码(在资源定义之外)。
    • 缺少双引号。
    【解决方案3】:

    只需添加一个资源字典 XAML 文件,假设它的名称为 Dictionary.xaml(Visual Studio 可以自动为您创建一个)

    然后,将您的静态资源添加到此字典中。

    最后,请在所有 XAML 控件中引用字典:

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

    【讨论】:

    • 它工作得很好,虽然如果你有很多控制可能会有点麻烦
    • 我认为即使你有很多控件,它也不会那么重:为你的解决方案的每个控件添加三行,它特别有助于你更多地理解你的代码很容易(例如,我的解决方案中有许多不同的字典:一个用于转换器,一个用于模板,一个用于动画......帮助我很容易地得到我想要的东西)。但是当然,如​​果你只有一个资源要保持共享,它会感觉很沉重
    【解决方案4】:

    你可以这样使用:

    首先,示例常量变量:

    namespace Constants
    {
        public class ControlNames
        {
            public const string WrapperGridName = "WrapperGrid";
        }
    }
    

    第二个 XAML 使用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多