繁体   English   中英

如何将WPF资源分配给其他资源标记

[英]How to assign WPF resources to other resource tags

这是非常模糊的,我可能只是遗漏了一些非常简单的东西。

场景1

让我说我在<Window.Resources>部分中创建了一个渐变画笔,如下<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>

然后很久以后,我想覆盖DataGrid的HighlightBrushKey 我基本上这样做了(太可怕了);

<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>标记中创建了两种颜色, <Window.Resources>

<SolidColorBrush x:Key="DataGridRowBackgroundBrush" Color="#EAF2FB" />
<SolidColorBrush x:Key="DataGridRowBackgroundAltBrush" Color="#FFFFFF" />

然后,我想在一个Array中提供它们,它在Binding上提供ConverterParameter,这样我就可以为我的静态资源实例提供自定义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>

同样,通过ResourceKey找到的实际Brush对象被直接添加到Brush[]数组中。 没有创建新的Brush

我认为,我们都习惯了使用StaticResourceExtension与标记扩展语法(例如{StaticResource Xyz}它很容易忘记,它也可以与常规元素的语法使用。

你正在使用的标记不够用。 您没有创建LinearGradientBrush ,这是您的第一个示例:您只需引用该资源。 例如:

<DataGrid HighlightBrushKey="{StaticResource GridRowSelectedBackBrushGradient}"  ....

在您的第二个示例中,我要说您要将数组声明为资源:

<x:Array Type="{x:Type Brush}" x:Key="MyArray">
  <SolidColorBrush Color="#EAF2FB" />
  <SolidColorBrush Color="#FFFFFF" />
</x:Array>

然后你可以使用

<Binding RelativeSource="{RelativeSource Mode=Self}" 
         Converter="{StaticResource BackgroundBrushConverter}"
         ConverterParameter="{Staticresource MyArray}" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM