2009-02-17 22 views
7

Tengo un pincel visual que es un grupo de formas, cuyo color principal es un recurso dinámico en sí mismo, por lo que la forma es, por ejemplo, MyShape y Color, MyColour al que hace referencia el objeto Shape.
Mi problema es cuando actualizo el color para esto - solo ocurre la primera vez que se carga la forma (el color debe establecerse primero) sin embargo, tanto como cambio el color, no actualizará el recurso dinámico que usa el color, ¿cómo hago que esto funcione?
Solo necesito hacer que un recurso dinámico funcione dentro de otro recurso dinámico y hacer que ambos se actualicen cuando cambie el color.
No tengo ni idea de cómo hacer que esto funcione. Pasé un tiempo creando un selector de color para WPF solo para descubrir que no puedo cambiar el color de este elemento. Los recursos de nivel 1 funcionan donde establezco el pincel/color directamente pero no un color dentro de otro objeto o Recurso de 2 niveles.¿Cómo actualizar el recurso dinámico dentro de un recurso dinámico?

Editar: Mi problema parece ser específico al uso de estos en un Recurso/Diccionario independiente ya que mi programa necesita acceder a este elemento desde una clase, no desde la ventana, el ejemplo principal mencionado no funciona cuando el MyColor está separado Recurso.

Respuesta

5

A menos que malinterprete la situación, exactamente de lo que está hablando funciona bastante bien. Yo sólo lo probé con este Xaml:

<Window x:Class="ConditionalTest.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" Height="300" Width="300"> 

    <Window.Resources> 
     <SolidColorBrush x:Key="MyColor" Color="Aqua" /> 

     <VisualBrush x:Key="MyBrush"> 
      <VisualBrush.Visual> 
       <Ellipse Height="50" Width="100" Fill="{DynamicResource MyColor}" /> 
      </VisualBrush.Visual> 
     </VisualBrush> 
    </Window.Resources> 
    <Grid Background="{DynamicResource MyBrush}"> 
     <Button Height="30" Width="Auto" VerticalAlignment="Center" HorizontalAlignment="Center" Content="ChangeColor" Click="Button_Click" /> 
    </Grid> 
</Window> 

Y entonces cambiado el color en el controlador de clic para ese botón:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    ((SolidColorBrush)Resources["MyColor"]).Color = Colors.Purple; 
} 

y funcionó como un campeón.

+0

Gracias por esto, esto no funciona, sin embargo, cuando el Recurso está en un Diccionario de Recursos, este parece ser mi problema Moví los recursos a la Ventana. Recursos como su ejemplo: esto funcionó, sin embargo, debe ser utilizable por una clase mi software - editaré mi pregunta para mencionar esto – RoguePlanetoid

+0

Mi solución fue almacenar el recurso Window.Resources como muestra este ejemplo en su lugar y esto funcionó como lo hizo su ejemplo, pero aún le hubiera gustado mantener todos los recursos en Resources.xaml, pero funciona y eso es lo que importa. – RoguePlanetoid

+0

¿Alguna vez alguien descubrió cómo usar esto dentro de un Diccionario de recursos? – tofutim

0

¿Puede publicar un ejemplo de cómo está intentando cambiar el color en el diccionario de recursos?

Cuando hago una aplicación de muestra y trato de cambiar el valor del recurso, aparece que SolidColorBrush en el diccionario de recursos se ha congelado por lo que no se puede modificar. Para evitar esto, establecí el nuevo valor en un nuevo SolidColorBrush.

+0

Crear un pincel nuevo cada vez funcionaría; sin embargo, esto niega el uso de un recurso dinámico ya que la recreación del recurso cada vez para una forma compleja con soporte de color no es tan simple como Dim Item como New SolidColorBrush (MyColor). – RoguePlanetoid

+0

Si el pincel se ha congelado, la única forma de cambiarlo es crear uno nuevo. Puede usar el método Clone que hará una copia, de esa manera solo tendrá que cambiar las propiedades que desea cambiar. ¿Puedes publicar un ejemplo de cómo trataste de cambiar el pincel? –

Cuestiones relacionadas