簡體   English   中英

WPF UserControl庫中的ResourceDictionary不起作用

[英]ResourceDictionary in WPF UserControl library doesn't work

我在wpf中創建了一個UserControl庫,並希望定義一些常規樣式。 所以我添加了一個global.xaml:

<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="DefaultSearchImage">
        pack://application:,,,/WPF_Controls;component/Images/Search.png
    </system:String>
</ResourceDictionary>

我想避免這種情況

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="../Styles/Globals.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

在每個用戶控件中出於性能原因。 因此,我在此站點找到了一種解決方案:

通過靜態字典使用Shared Resourec

我的DictionaryLoaderClass:

internal static class SharedDictionaryManager
{
    internal static ResourceDictionary SharedDictionary
    {
        get
        {
            if (_sharedDictionary == null)
            {
                var resourceLocater =
                    new Uri(@"/pack://application:,,,/WPF_Controls;component/Styles/Globals.xaml", UriKind.Relative);
                _sharedDictionary =
                    (ResourceDictionary)Application.LoadComponent(resourceLocater);
            }
            return _sharedDictionary;
        }
    }


    private static ResourceDictionary _sharedDictionary;
}

在每個用戶控件的構造函數中:

public SearchPanel()
{
    InitializeComponent();
    Resources.MergedDictionaries.Add(SharedDictionaryManager.SharedDictionary);
}

但是我總是在運行時遇到一個異常,即找不到鍵“ DefaultSearchImage” ...

如果要以全局樣式將其加載給每個用戶控件,為什么不將其加載到窗口資源中呢? 然后,添加到樹中的所有內容都會繼承適用的樣式:

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="600" Width="800">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles/Globals.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
...content including UserControls
</Window>

然后,您可以將其作為靜態資源進行訪問:

Property="{StaticResource ResourceKey=DefaultSearchImage}"

並在后面的代碼中:

(String)Resources["DefaultSearchImage"];

或非UI代碼:

(String)Application.Current.Resources["DefaultSearchImage"];

雖然我建議這樣的事情:

<system:String x:Key="DefaultSearchImagePath">pack://application:,,,/WPF_Controls;component/Images/Search.png</system:String>
<BitmapImage x:Key="DefaultSearchImage" UriSource=DefaultSearchImage />

這也將允許用戶控件的重用行為達到任何人的期望。 如果您或項目中的其他開發人員想要更改該圖像,那么他們只需要在此處放置自己的樣式,而不會在以后的運行時被覆蓋(誰想去那里看?)

這是WPF的強大優勢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM