.net - 如何将 WPF 资源分配给其他资源标签

标签 .net wpf xaml 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>

然后很久以后,我想覆盖 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}" />

这显然不是引用资源的最巧妙的方式。我还提出了以下问题,几乎相同。

场景二

假设我在 <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>

我所做的是尝试重新引用现有资源,但在我的努力中,我实际上重新创建了资源,并绑定(bind)了属性以使其匹配。同样,这并不理想。

因为我现在至少遇到过两次这个问题,有没有更好的方法?

谢谢,汤姆

最佳答案

我想知道什么时候有人会问这个问题。

在场景 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被 build 。

我想我们都习惯使用 StaticResourceExtension使用标记扩展语法(例如 {StaticResource Xyz} )很容易忘记它也可以与常规元素语法一起使用。

关于.net - 如何将 WPF 资源分配给其他资源标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3036563/

相关文章:

java - 比较新项目的 ASP.NET MVC 和 Grails

c# - 在具有透明背景的 Canvas 上获取鼠标位置

c# - 如何从 XAML 中的 CLR 命名空间映射类型,而不是声明它的程序集?

c# - 为什么 ObservableCollection 隐藏 INotifyPropertyChanged.PropertyChanged

c# - 绑定(bind)到应用程序设置中对象的字段

.net - 数据适配器 : Is it possible to fill a Collection-Type instead of a DataTable/DataSet?

c# - 从数据库中获取数据的问题

.net - 并行 Foreach 内存问题

WPF - XAML - DataGridRow 样式触发器 IsMouseOver 工具提示数据绑定(bind)

c# - 由于 PreviewMouseLeftButtonDown,Datagrid 内的按钮未被触发