[英]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>
在每個用戶控件中出於性能原因。 因此,我在此站點找到了一種解決方案:
我的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.