Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 资源字典定位器_Wpf_Mvvm - Fatal编程技术网

Wpf 资源字典定位器

Wpf 资源字典定位器,wpf,mvvm,Wpf,Mvvm,有没有办法创建ResourceDictionary定位器。 现在我在xaml中有: <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="../../Resources/StringResources.xaml"/> </ResourceDiction

有没有办法创建ResourceDictionary定位器。 现在我在xaml中有:

 <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../../Resources/StringResources.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

其中代码隐藏根据currentculture设置字典列表

我想要一个

 <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <Locator "StringResources"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>


或者像这样的东西,我不必修改每个v.xaml.cs文件

我真的不知道这是否可行,但是你想让你的应用程序“本地化”吗?也许这篇文章会对您有所帮助:。

我真的不知道这是否可行,但您想让您的应用程序“可本地化”吗?这篇文章可能会对您有所帮助:。

您可以创建自己的ResourceDictionary:

public class ResourceDictionaryLocator : ResourceDictionary
{
    public ResourceDictionaryLocator()
    {
        switch (CurrentLocalization)
        {
            case "English":
                base.Source = new Uri("pack://application:,,,/Languages/English.xaml");
                break;

            case "French":
                base.Source = new Uri("pack://application:,,,/Languages/French.xaml");
                break;
        }
    }
}
然后像这样消费:

<Application x:Class="TestingWPF.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:TestingWPF"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <local:ResourceDictionaryLocator />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

您可以创建自己的ResourceDictionary:

public class ResourceDictionaryLocator : ResourceDictionary
{
    public ResourceDictionaryLocator()
    {
        switch (CurrentLocalization)
        {
            case "English":
                base.Source = new Uri("pack://application:,,,/Languages/English.xaml");
                break;

            case "French":
                base.Source = new Uri("pack://application:,,,/Languages/French.xaml");
                break;
        }
    }
}
然后像这样消费:

<Application x:Class="TestingWPF.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:TestingWPF"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <local:ResourceDictionaryLocator />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

您可以创建一个
MarkupExtension
,该扩展将返回请求的ResourceDictionary:

public class ResourceDictionaryLocator : ResourceDictionary
{
    public ResourceDictionaryLocator()
    {
        switch (CurrentLocalization)
        {
            case "English":
                base.Source = new Uri("pack://application:,,,/Languages/English.xaml");
                break;

            case "French":
                base.Source = new Uri("pack://application:,,,/Languages/French.xaml");
                break;
        }
    }
}
公共类ResourceDictionaryCator:MarkupExtension
{
公共字符串字典名称{get;set;}
公共覆盖对象ProviderValue(IServiceProvider服务提供程序)
{
//返回所需资源字典的逻辑
如果(DictionaryName==“…”)
{
}
返回null;
}
}
然后在xaml中使用它:

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <local:ResourceDictionaryLocator DictionaryName="StringResources" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

您可以创建一个
标记扩展名
,该扩展名将返回请求的ResourceDictionary:

public class ResourceDictionaryLocator : ResourceDictionary
{
    public ResourceDictionaryLocator()
    {
        switch (CurrentLocalization)
        {
            case "English":
                base.Source = new Uri("pack://application:,,,/Languages/English.xaml");
                break;

            case "French":
                base.Source = new Uri("pack://application:,,,/Languages/French.xaml");
                break;
        }
    }
}
公共类ResourceDictionaryCator:MarkupExtension
{
公共字符串字典名称{get;set;}
公共覆盖对象ProviderValue(IServiceProvider服务提供程序)
{
//返回所需资源字典的逻辑
如果(DictionaryName==“…”)
{
}
返回null;
}
}
然后在xaml中使用它:

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <local:ResourceDictionaryLocator DictionaryName="StringResources" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>


这太棒了,我让这个定位器收听全球语言更改事件,我的整个应用程序现在从下拉列表中更改。感谢您提供这个优雅的解决方案这太棒了,我让这个定位器收听全球语言更改事件,我的整个应用程序现在从下拉列表更改。感谢您提供了这个优雅的解决方案