我曾经有一个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#代码那样是私有的。有谁知道我怎么能做到这一点?
提前致谢!
答案 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中)