wpf 如何在代码隐藏中获得ResourceDictionary的x:Name属性?

hs1ihplo  于 2023-03-13  发布在  其他
关注(0)|答案(2)|浏览(233)

正如标题所说,我只想在代码后面获得ResourceDictionaryx:Name属性。
我的ResourceDictionary

<ResourceDictionary x:Name="DefaultLight"
                    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
...
</ResourceDictionary>

我的应用程序.Xaml

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/MyLib;component/Resources/OutgoingResources.xaml"/>
                <ResourceDictionary Source="/MyLib;component/Resources/Themes/DefaultDark.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

我的代码:

Console.WriteLine(Application.Current.Resources.MergedDictionaries[1].???);
w80xi6nr

w80xi6nr1#

ResourceDictionary没有由XAML处理器设置的Name属性。
您可以创建一个自定义类型,但添加一个Name属性:

public class NamedResourceDictionary : ResourceDictionary 
{
    public string Name { get; set; }
}

然后在XAML标记中设置属性:

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <local:NamedResourceDictionary Name="Dark" Source="/MyLib;component/Resources/Themes/DefaultDark.xaml"/>
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

...并通过将合并的资源字典强制转换为您的自定义类型来检索它:

var name = (Application.Current.Resources.MergedDictionaries[0] as NamedResourceDictionary)?.Name;
e3bfsja2

e3bfsja22#

我不认为你会得到的名称回来,一旦它被合并。
但是,您可以找到资源字典的源代码:

var mergedDict = Application.Current.Resources.MergedDictionaries;
        foreach (var rd in mergedDict)
        {
            Debug.WriteLine(rd.Source.OriginalString);
        }

适用于:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary  Source="/Resources/Dictionary1.xaml"/>
            <ResourceDictionary  Source="/Resources/Dictionary2.xaml"/>
         </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

我得到

/Resources/Dictionary1.xaml
/Resources/Dictionary2.xaml

除了Dictionary1或Dictionary2,你当然可以将这些文件命名为DefaultLight.xaml、DefaultDark.xaml等。
如果您的目的只是查看合并了哪个主题资源字典,那么您可以“只”在每个字典中设置一个键来告诉您。

<clr:String x:Key="CurrentTheme">DefaultDark</clr:String>

当然还有光源字典中的DefaultLight,使用相同的键。
如果你想给一堆资源字典起一个友好的名字,你可以定义一个列表来实现解耦。一个列表中包含name、url和IsLoaded bool的类。加载你在代码中选择的任何一个,并将其标记为已加载。

相关问题