如何將 WPF 資源分配給其他資源標籤
這很模糊,我可能只是錯過了一些非常簡單的東西。
方案 1
假設我創建了一個漸變畫筆,在我的
<Window.Resources>部分中是這樣的:<LinearGradientBrush x:Key="GridRowSelectedBackBrushGradient" StartPoint="0,0" EndPoint="0,1"> <GradientStop Color="#404040" Offset="0.0" /> <GradientStop Color="#404040" Offset="0.5" /> <GradientStop Color="#000000" Offset="0.6" /> <GradientStop Color="#000000" Offset="1.0" /> </LinearGradientBrush>然後很久以後,我想覆蓋
HighlightBrushKeyDataGrid。我基本上是這樣做的(可怕);<LinearGradientBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" GradientStops="{Binding Source={StaticResource GridRowSelectedBackBrushGradient}, Path=GradientStops}" StartPoint="{Binding Source={StaticResource GridRowSelectedBackBrushGradient}, Path=StartPoint}" EndPoint="{Binding Source={StaticResource GridRowSelectedBackBrushGradient}, Path=EndPoint}" />這顯然不是引用資源的最巧妙的方式。我還提出了以下問題,幾乎相同。
方案 2
假設我在
<Window.Resources>標記中創建了兩種顏色,如下所示:<SolidColorBrush x:Key="DataGridRowBackgroundBrush" Color="#EAF2FB" /> <SolidColorBrush x:Key="DataGridRowBackgroundAltBrush" Color="#FFFFFF" />稍後,我想在一個數組中提供它們,該數組將 ConverterParameter 提供給 Binding ,這樣我就可以為自定義 Converter 提供我的靜態資源實例:
<Setter Property="Background"> <Setter.Value> <Binding RelativeSource="{RelativeSource Mode=Self}" Converter="{StaticResource BackgroundBrushConverter}"> <Binding.ConverterParameter> <x:Array Type="{x:Type Brush}"> <SolidColorBrush Color="{Binding Source={StaticResource DataGridRowBackgroundBrush}, Path=Color}" /> <SolidColorBrush Color="{Binding Source={StaticResource DataGridRowBackgroundAltBrush}, Path=Color}" /> </x:Array> </Binding.ConverterParameter> </Binding> </Setter.Value> </Setter>我所做的是嘗試重新引用現有資源,但在我的努力中,我實際上重新創建了資源,並綁定了屬性以使其匹配。同樣,這並不理想。
因為我現在至少遇到過兩次這個問題,有沒有更好的方法?
謝謝,湯姆
我想知道什麼時候有人會問這個問題。
在場景 1 中您想要做的是有效地為單個資源賦予“別名”。這很容易通過只有在你看到它之後才看起來很明顯的標記來完成。假設我們在 App.xaml 或其他地方有這個:
<ResourceDictionary> <LinearGradientBrush x:Key="GridRowSelectedBackBrushGradient" ... /> </ResourceDictionary>要在另一個 ResourceDictionary 中包含別名,只需:
<ResourceDictionary> <StaticResourceExtension x:Key="{x:Static SystemColors.HighlightBrushKey}" ResourceKey="GridRowSelectedBackBrushGradient" /> </ResourceDictionary>這會在第一個 ResourceDictionary 中查找畫筆對象,並將相同的對象添加到第二個 ResourceDictionary 的新鍵下。這也適用於單個 ResourceDictionary。
對於您的場景 2,解決方案同樣簡單:
<Binding.ConverterParameter> <x:Array Type="{x:Type Brush}"> <StaticResourceExtension ResourceKey="DataGridRowBackgroundBrush" /> <StaticResourceExtension ResourceKey="DataGridRowBackgroundAltBrush" /> </x:Array> </Binding.ConverterParameter>同樣,
Brush通過 找到的實際對象ResourceKey直接添加到Brush[]數組中。沒有新Brush的被創建。我認為我們都習慣於使用
StaticResourceExtension標記擴展語法(例如{StaticResource Xyz}),很容易忘記它也可以與正常元素語法一起使用。