Pregunta

Tengo un elemento existente, que es un hijo de un lienzo. El estilo del tema figura en un diccionario de recursos que contiene los diversos cepillos que pueden ser utilizados para colorear el artículo.

Cuando se crea una instancia del elemento se le da el color por defecto. Soy actualmente no es capaz de interactuar directamente con la propiedad Fill como en:

item.Fill = BrushBlue;

Por esta razón empecé a buscar en el XAML para cada instancia del elemento.

El XAML Estoy interesado en el artículo después de una instancia que se crea es:

<d:Item IsSelected="True" Width="78" Height="65" Panel.ZIndex="0" Canvas.Left="233"     Canvas.Top="352.54">
    <Path ToolTip="Process">
        <Path.Style>
             <Style TargetType="Path">
                 <Style.BasedOn>
                     <Style TargetType="Path">
                         <Style.Resources>
                            <ResourceDictionary />
                         </Style.Resources>
                         <Setter Property="Shape.Fill">
                             <Setter.Value>
                                 <DynamicResource ResourceKey="ItemBrush" />
                             </Setter.Value>
                         </Setter>
                     </Style>
                 </Style.BasedOn>
             </Style>
        </Path.Style>
    </Path>
.
.
.
</d:Item>

Me lo ideal sería poder atar el valor Shape.Fill a una propiedad de la instancia del tema, o por lo menos ser capaz de cambiar ese valor en función de la selección del usuario en la aplicación.

Estoy editando el XAML del elemento para cambiar su color de relleno. Para lograr esto estoy usando el siguiente código, basado en la muestra botón clon de MSDN:

string savedItem = XamlWriter.Save(this) as String;

string newItem = savedItem.Replace(GetFillBrush(this), "BrushBlue");
SetFillBrush(this, "BrushBlue");

StringReader stringReader = new StringReader(newItem);
XmlReader xmlReader = XmlReader.Create(stringReader);

thisCanvas.Children.Add((Item)XamlReader.Load(xmlReader));

Me estoy haciendo el XAML, actualizar el nombre de recurso de pincel y luego generar un nuevo elemento.

Este enfoque fue una prueba de concepto. Quiero ser capaz de actualizar el XAML del elemento existente sin tener que crear un nuevo elemento en el lienzo.

¿Cuál es la mejor manera de lograr esta actualización "in situ" de la propiedad de relleno del artículo?

¿Fue útil?

Solución

Asumo que el cepillo está siendo utilizado en más de un lugar, por lo que no se puede simplemente establecer la propiedad Fill:

item.Fill = Brushes.Blue;

En ese caso, lo que debe hacer es encapsular el elemento en un control de control de usuario o la costumbre, con una propiedad de dependencia del tipo de cepillo. (Dependiendo del uso del cepillo, también puede llamar a este relleno, o puede ser más específica, por ejemplo AccentFill, OuterBorderFill, etc.) Luego, en el XAML, se unen todas esas múltiples ocurrencias de la brocha a esa propiedad. Ahora DO tienen un único lugar donde se puede establecer la propiedad, ya través de los enlaces que se propagará a todos los lugares que se necesite:

item.AccentFill = Brushes.Blue;

En cualquier caso, la clave es no pensar en "actualizar el XAML del elemento existente." XAML es un formato de serialización. Su elemento existente ya es un objeto .NET en la memoria y se puede establecer propiedades en él directamente, en lugar de tener que recargar de una forma serializada.

Otros consejos

A menos que yo estoy mal entendido su pregunta, usted es realmente hacerlo de la manera difícil. ¿Por qué no este trabajo?

this.Fill = Brushes.Blue;

o si es importante utilizar un nombre de recurso:

this.Fill = (Brush)FindResource("BlueBrush")

Tal vez usted necesita para aclarar su pregunta a explicar por qué no se puede simplemente establecer el valor y hacer con ella.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top