Frage

Ich habe einen vorhandenen Artikel, bei dem es sich um ein Kind einer Leinwand handelt. Der Stil des Elements ist in einem Ressourcenwörterbuch enthalten, das die verschiedenen Pinsel enthält, die zum Färben des Elements verwendet werden können.

Wenn eine Instanz des Elements erstellt wird, erhält es die Standardfärbung. Ich bin derzeit nicht in der Lage, direkt mit der Fill -Eigenschaft zu interagieren wie in:

item.Fill = BrushBlue;

Aus diesem Grund habe ich mir die XAML für jede Instanz des Artikels angesehen.

Das XAML, an dem ich mich für den Artikel interessiere, nachdem eine Instanz erstellt wurde, ist:

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

Ich möchte idealerweise in der Lage sein, die Form zu binden. Füllen Sie den Wert an eine Eigenschaft der Instanz des Elements oder können Sie diesen Wert zumindest anhand der Benutzerauswahl in der Anwendung ändern.

Ich bearbeite das XAML des Elements, um seine Füllfarbe zu ändern. Um dies zu erreichen, verwende ich den folgenden Code, basierend auf der Schaltflächenklon -Probe von 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));

Ich erhalte den XAML, aktualisiere den Namen der Pinselressourcen und generiere dann ein neues Element.

Dieser Ansatz war ein Beweis für das Konzept. Ich möchte in der Lage sein, die XAML des vorhandenen Elements zu aktualisieren, ohne ein neues Element auf der Leinwand erstellen zu müssen.

Was ist der beste Weg, um dieses "In-Place" -Antuping der Füllmobilie des Artikels zu erreichen?

War es hilfreich?

Lösung

Ich gehe davon aus, dass der Pinsel an mehr als einem Ort verwendet wird, weshalb Sie die Fill -Eigenschaft nicht einfach einstellen können:

item.Fill = Brushes.Blue;

In diesem Fall sollten Sie das Element in eine UserControl- oder benutzerdefinierte Steuerung mit einer Abhängigkeitseigenschaft des Typs des Typs einkapseln. (Abhängig von der Verwendung des Pinsels können Sie diese Füllung auch aufrufen, oder es ist möglicherweise spezifischer, z. B. Accentfill, OuterborderFill usw.) In Ihrem XAML binden Sie all diese mehrfachen Vorkommen der Bürste an diese Eigenschaft. Jetzt du tun Haben Sie einen einzelnen Ort, an dem Sie die Eigenschaft einstellen können, und wird durch die Bindungen an alle Orte ausbreitet, die sie benötigt:

item.AccentFill = Brushes.Blue;

In jedem Fall ist es nicht wichtig, "die XAML des vorhandenen Elements zu aktualisieren". XAML ist ein Serialisierungsformat. Ihr vorhandenes Element ist bereits ein .NET -Objekt im Speicher und Sie können Eigenschaften direkt darauf einstellen, anstatt aus einem serialisierten Formular nachladen zu müssen.

Andere Tipps

Wenn ich Ihre Frage nicht missverstehe, sind Sie es sind Sie Ja wirklich auf die harte Tour machen. Warum würde das nicht funktionieren?

this.Fill = Brushes.Blue;

oder wenn es wichtig ist, einen Ressourcennamen zu verwenden:

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

Vielleicht müssen Sie Ihre Frage klären, um zu erklären, warum Sie den Wert nicht einfach festlegen und damit fertig werden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top