Esto es bastante oscuro, me puede estar perdiendo algo extremadamente simple.Cómo asignar recursos de WPF a otras etiquetas de recursos
Escenario 1
digamos que creo un pincel de degradado, como esto en mi sección <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>
A continuación, mucho más tarde, quiero anular el HighlightBrushKey
de una cuadrícula de datos. Básicamente lo he hecho así (horrible);
<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}" />
Evidentemente, esta no es la mejor manera de hacer referencia a un recurso. También se me ocurrió el siguiente problema, que es casi idéntico.
Escenario 2
Di creé dos colores en mi <Window.Resources>
marcado, así:
<SolidColorBrush x:Key="DataGridRowBackgroundBrush" Color="#EAF2FB" />
<SolidColorBrush x:Key="DataGridRowBackgroundAltBrush" Color="#FFFFFF" />
Luego, más tarde, quiero suministrarlos en una matriz, que alimenta el ConverterParameter en una unión para que pueda suministrar el convertidor de medida con mis instancias de recursos estáticos:
<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>
lo que he Don Es un intento de re-referenciar un recurso existente, pero en mi esfuerzo, he recreado el recurso y atado las propiedades para que coincidan. Nuevamente, esto no es ideal.
Porque ahora he llegado a este problema al menos dos veces, ¿hay una manera mejor?
Gracias, Tom
Sí, ¡Ray eso es totalmente! Déjame hablar un poco con mi xaml y te contaré cómo me llevo. En lo que a mí respecta, ¡esta es la respuesta! ¡Gracias! – Tom
Ok, como Window.Resources es en sí mismo un ResourceDictionary, simplemente he reemplazado mis duplicados de recursos fallidos con StaticResourceExtension y simplemente funciona. Esto es magia, muchas gracias. – Tom
Mientras esto funciona, provoca errores de compilador espurios y transitorios: un objeto del tipo "System.Windows.StaticResourceExtension" no se puede aplicar a una propiedad que espera el tipo "System.Windows.Media.Color". Estos van y vienen, a veces incluso persisten después de una construcción y desaparecen tras otra. –