请参阅资源文件中的资源键

时间:2012-09-25 14:31:58

标签: c# wpf resourcedictionary

我曾经有一个WinForms应用程序,其中我使用静态类来处理简单的字符串资源。在这个课程中,我有可以访问的常量字符串。其中一个字符串由另一个常量的值加上它自己的值组成。像这样:

private const string Path = @"C:\SomeFolder\";
public const string FileOne = Path + "FileOne.txt";
public const string FileTwo = Path + "FileTwo.txt";

现在我有一个WPF应用程序,我使用的是ResourceDictionary,我合并到了Application范围。一切正常,但我想要类似上面的C#代码。这就是我已经拥有的:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:System="clr-namespace:System;assembly=mscorlib">

    <System:String x:Key="Path">C:\SomeFolder\</System:String>
    <System:String x:Key="FileOne">FileOne.txt</System:String>
    <System:String x:Key="FileTwo">FileTwo.txt</System:String>

</ResourceDictionary>

现在我需要一些东西(某种对'Path'的引用)自动添加到两个文件串中,它不需要像C#代码那样是私有的。有谁知道我怎么能做到这一点?

提前致谢!

2 个答案:

答案 0 :(得分:1)

您仍然可以使用带有资源的静态类:

namespace WpfStaticResources
{
    class MyResources {
        private const string Path = @"C:\SomeFolder\";
        public const string FileOne = Path + "FileOne.txt";
        public const string FileTwo = Path + "FileTwo.txt";
    }
}

然后从你的XAML引用中得到:

<Window x:Class="WpfStaticResources.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfStaticResources="clr-namespace:WpfStaticResources" 
    Title="{x:Static WpfStaticResources:MyResources.FileOne}" Height="350" Width="525">
    <Grid>

    </Grid>
</Window>

我个人更喜欢不使用静态类,而是创建一个域对象,将其设置为DataContext,然后绑定到它上面的属性。

答案 1 :(得分:1)

如果你想在XAML中使用它,这里有两个想法:

创意1:一个Binding

在您的资源中,只需添加Path

<System:String x:Key="Path">C:\SomeFolder\</System:String>

而且,在你的XAML中的某个地方:

<TextBlock Text='{Binding Source={StaticResource Path}, StringFormat={}{0}FileOne.txt}' />

这将显示Path +“FileOne.txt”

(注意:你可以写任何你想要的而不是FileOne.txt)

您可以使用这种方式获得自定义内容。

创意2:一个MultiBinding

你想要做的事情更方便imho:你保留了你定义的那三个Resources

如果你想在某处调用它们以便显示Path + fileOne,只需使用它(带有TextBlock的例子)

    <TextBlock >
        <TextBlock.Text>
            <MultiBinding StringFormat="{}{0}{1}">
                <Binding Source="{StaticResource Path}" />
                <Binding Source="{StaticResource FileOne}" />
            </MultiBinding>
        </TextBlock.Text>
    </TextBlock>

这就是你所需要的一切!

或者,如果您不在UI中使用这些String,您仍然可以使用静态类。但是使用XAML方式是更清洁的imho(所有与UI相关的东西都应该保留在XAML中)