キャンバスの子である既存のアイテムがあります。アイテムのスタイルは、アイテムの色付けに使用できるさまざまなブラシを含むリソース ディクショナリに含まれています。
アイテムのインスタンスが作成されると、デフォルトのカラーリングが与えられます。現在、次のように Fill プロパティを直接操作することはできません。
item.Fill = BrushBlue;
このため、アイテムの各インスタンスの XAML を調べ始めました。
インスタンスが作成された後のアイテムに興味のある XAML は次のとおりです。
<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>
理想的には、Shape.Fill 値をアイテムのインスタンスのプロパティに結び付けたり、少なくともアプリケーションでのユーザーの選択に基づいてその値を変更できるようにしたいと考えています。
項目の XAML を編集して塗りつぶしの色を変更しています。これを実現するために、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));
XAML を取得し、ブラシ リソース名を更新してから、新しいアイテムを生成しています。
このアプローチは概念実証でした。キャンバスに新しいアイテムを作成しなくても、既存のアイテムの XAML を更新できるようにしたいと考えています。
アイテムの塗りつぶしプロパティのこの「インプレース」更新を達成するための最良の方法は何ですか?