Question

J'ai un élément existant qui est un enfant d'une toile. Le style de l'élément est contenu dans un dictionnaire de ressources qui contient les diverses brosses qui peuvent être utilisés pour colorer l'élément.

Lorsqu'une instance de l'élément est créé, il est donné la couleur par défaut. Je suis actuellement pas en mesure d'interagir directement avec la propriété de remplissage comme dans:

item.Fill = BrushBlue;

Pour cette raison, j'ai commencé à regarder le XAML pour chaque instance de l'élément.

Le XAML Je suis intéressé par le produit après une instance créée est:

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

Je voudrais idéalement être en mesure de lier la valeur Shape.Fill à une propriété de l'instance de l'élément, ou au moins être en mesure de changer cette valeur en fonction de la sélection de l'utilisateur dans l'application.

Je suis l'édition XAML de l'élément à changer sa couleur de remplissage. Pour ce faire, je suis en utilisant le code suivant, en fonction de l'échantillon clone bouton 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));

Je reçois le XAML, mettre à jour le nom de la ressource de brosse, puis générer un nouvel élément.

Cette approche est une preuve de concept. Je veux être en mesure de mettre à jour le XAML de l'élément existant sans avoir à créer un nouvel élément sur la toile.

Quelle est la meilleure façon d'y parvenir cette mise à jour « en place » des biens de remplissage de l'élément?

Était-ce utile?

La solution

Je suppose que la brosse est utilisée dans plus d'un endroit, ce qui est la raison pour laquelle vous ne pouvez pas définir simplement la propriété de remplissage:

item.Fill = Brushes.Blue;

Dans ce cas, ce que vous devez faire est encapsulent l'élément dans un contrôle UserControl ou sur mesure, avec une propriété de dépendance de type brosse. (Selon l'utilisation de la brosse, vous pouvez appeler aussi ce remplissage, ou peut-être plus précis, par exemple AccentFill, OuterBorderFill, etc.) Ensuite, dans votre XAML, lier tous les multiples occurrences de la brosse à cette propriété. Maintenant, vous ne ont un seul endroit où vous pouvez définir la propriété, et par les liaisons qu'il propagera à tous les endroits, il est nécessaire:

item.AccentFill = Brushes.Blue;

En tout état de cause, l'élément clé est de ne pas penser à « mettre à jour le XAML de l'élément existant. » XAML est un format de sérialisation. Votre élément existant est déjà un objet .NET en mémoire et vous pouvez définir les propriétés sur directement plutôt que de devoir recharger à partir d'une forme sérialisée.

Autres conseils

À moins que je comprends mal votre question, vous êtes vraiment le faire à la dure. Pourquoi pas ce travail?

this.Fill = Brushes.Blue;

ou s'il est important d'utiliser un nom de ressource:

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

Peut-être que vous avez besoin de clarifier votre question pour expliquer pourquoi vous ne pouvez pas définir simplement la valeur et faire avec elle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top