XAMLReaderを使用して所定の位置にWPFコントロールを更新
-
18-09-2019 - |
質問
私は、キャンバスの子である既存のアイテムを持っています。アイテムのスタイルがアイテムを色付けするために使用することができ、様々なブラシが含まれているリソースディクショナリに含まれています。
アイテムのインスタンスが作成されると、は、デフォルトのカラーリングを与えています。
:私は現在、直接のように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を更新できるようにしたいです。
アイテムのfillプロパティのこの「インプレース」の更新を達成するための最良の方法は何ですか?
解決
私はブラシがあなただけのFillプロパティを設定することができない理由である複数の場所で使用されていることを前提としています:
item.Fill = Brushes.Blue;
その場合は、あなたが何をすべきかは、型ブラシの依存関係プロパティで、ユーザーコントロールまたはカスタムコントロールに項目をカプセル化しています。 (ブラシの用途に応じて、あなたも、この塗りつぶしを呼ぶかもしれない、またはそれはなど、例えばAccentFill、OuterBorderFill、より具体的であるかもしれない)次に、あなたのXAMLで、そのプロパティへのブラシのすべてのそれらの複数の出現をバインドします。今、あなたは<全角> は、プロパティを設定することができ、単一の場所を持っていない、とバインディングを通じて、それはそれが必要とされるすべての場所に反映されます。
item.AccentFill = Brushes.Blue;
いずれにせよ、重要なことは考えることではない「既存のアイテムのXAMLを更新します。」 XAMLは、シリアル化形式です。あなたの既存のアイテムは既にメモリ内の.NETオブジェクトであり、あなたがシリアル化されたフォームからリロードする必要がより直接的ではなく、それにプロパティを設定することができます。
他のヒント
私はあなたの質問を誤解していない限り、あなたはの本当にのそれを苦労してやって。なぜだろうではない、この作品?
this.Fill = Brushes.Blue;
またはそれは、リソース名を使用することが重要である場合:
this.Fill = (Brush)FindResource("BlueBrush")
たぶん、あなたはあなただけの値を設定することはできませんし、それを行うことが理由を説明するためにあなたの質問を明確にする必要があります。