Dot-Net

如何將 WPF 資源分配給其他資源標籤

  • June 15, 2010

這很模糊,我可能只是錯過了一些非常簡單的東西。

方案 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}),很容易忘記它也可以與正常元素語法一起使用。

引用自:https://stackoverflow.com/questions/3036563