Domanda

Ho un elemento esistente, che è figlio di una tela. Lo stile del prodotto è contenuta in un dizionario risorse che contiene i vari pennelli che possono essere utilizzati per colorare la voce.

Quando si crea un'istanza della voce è data la colorazione di default. Sono attualmente in grado di interagire direttamente con la proprietà Fill come in:

item.Fill = BrushBlue;

Per questo motivo ho iniziato a guardare il codice XAML per ogni istanza della voce.

Il XAML Sono interessato per la voce dopo che l'istanza viene creato è:

<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>

Vorrei idealmente piace essere in grado di legare il valore Shape.Fill a una proprietà dell'istanza della voce, o almeno essere in grado di modificare tale valore in base alla selezione utente nell'applicazione.

Io sono la modifica del codice XAML della voce per cambiare il suo colore di riempimento. Per fare questo sto usando il seguente codice, sulla base del campione tasto clone da 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));

Mi è toccato il XAML, aggiornando il nome della risorsa pennello e quindi la generazione di un nuovo elemento.

Questo approccio è stato una prova di concetto. Voglio essere in grado di aggiornare il codice XAML del elemento esistente senza dover creare un nuovo elemento sulla tela.

Qual è il modo migliore per ottenere questo aggiornamento "in-place" della proprietà di riempimento della voce?

È stato utile?

Soluzione

Si considera che il pennello viene utilizzato in più di un posto, che è il motivo per cui non si può semplicemente impostare la proprietà Fill:

item.Fill = Brushes.Blue;

In questo caso ciò che si dovrebbe fare è incapsulare l'elemento in un controllo UserControl o personalizzato, con una proprietà di dipendenza di tipo pennello. (A seconda dell'uso del pennello, si potrebbe anche chiamare questo Fill, o potrebbe essere più specifici, per esempio AccentFill, OuterBorderFill, ecc) Poi, nel tuo XAML, si legano tutte quelle più occorrenze del pennello per quella proprietà. Ora è do hanno un unico luogo dove è possibile impostare la proprietà, e attraverso le associazioni che si propagheranno a tutti i luoghi che è necessario:

item.AccentFill = Brushes.Blue;

In ogni caso, la cosa fondamentale è non pensare "l'aggiornamento del XAML della voce esistente." XAML è un formato di serializzazione. Il tuo articolo esistente è già un oggetto .NET in memoria ed è possibile impostare le proprietà su di esso direttamente piuttosto che dover ricaricare da una forma serializzato.

Altri suggerimenti

A meno che non sto equivoco tua domanda, sei davvero di farlo nel modo più duro. Perché non sarebbe questo lavoro?

this.Fill = Brushes.Blue;

o se è importante utilizzare un nome di risorsa:

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

Forse avete bisogno di chiarire la tua domanda per spiegare perché non si può semplicemente impostare il valore e da fare con esso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top