我的基本目標是ResourceDictionary在一個 dll 中有一個我可以通過ResourceDictionary.MergedDictionaries. 但是我不想ResourceDictionary通過在參考應用程式的 XAML 中硬編碼 URI 來參考 URI,我想參考一些將提供 URI 的靜態成員。
我有一些“作業”的簡化代碼,但僅在運行時。在設計時它會拋出錯誤,我沒有得到 IntelliSense 支持。對于這個簡化的示例,所有內容都在一個程式集中(沒有單獨的 dll)。
Dic.xaml(我要參考的資源字典):
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<SolidColorBrush Color="Blue" x:Key="BlueBrush"/>
</ResourceDictionary>
Foo(用 URI 保存靜態成員的模塊):(
VB.NET 版本)
Public Module Foo
'[VBTest] is the name of assembly
Public ReadOnly Property URI As New Uri("pack://application:,,,/VBTest;component/Dic.xaml")
End Module
(C#版本)
public static class Foo
{
//[VBTest] is the name of assembly
public static Uri URI { get; } = new Uri("pack://application:,,,/VBTest;component/Dic.xaml");
}
最后,我想在應用程式中參考的位置ResourceDictionary:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:VBTest">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="{x:Static local:Foo.URI}"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Border Width="100" Height="100" Background="{StaticResource BlueBrush}"/>
</Window>
在設計時,我收到兩個錯誤:
XDG0062 An error occurred while finding the resource dictionary "".
XDG0062 The resource "BlueBrush" could not be resolved.
但是,該專案將構建和運行得很好。并將顯示預期的藍色方塊。
問題是,我怎樣才能讓它在設計時作業?
uj5u.com熱心網友回復:
幸運的是,我找到了一個簡單的解決方法。也許不是最漂亮的,但它很優雅。我從這個答案中獲得了一些相關問題的靈感。
通過創建自己的繼承自 的類ResourceDictionary,我可以更好地控制加載行為。這聽起來很復雜,但實際上我所要做的只是將其設定Source為建構式的一部分,并且一切正常。
以下添加到代碼檔案(/的外部):Modulestatic class Foo
Public Class StylesResourceDictionary
Inherits ResourceDictionary
Public Sub New()
MyBase.New()
Source = URI
End Sub
End Class
請注意,這是從問題代碼Source = URI中參考的。Foo.URI
然后 XAML 檔案變為:
<Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:VBTest">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<local:StylesResourceDictionary/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Border Width="100" Height="100" Background="{StaticResource BlueBrush}"/>
</Window>
并且 bam,完整的設計時支持,無需將 URI 硬編碼到參考應用程式中。ResourceDictionary及其 URI 的控制現在位于 dll 的域中,并且可以使用專用類以(有點)靜態方式參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/527049.html
標籤:wpf乌里资源字典
上一篇:編輯時在DataGrid文本單元格中插入和選擇文本的行為
下一篇:更新mongo檔案中的嵌套陣列
