1

キャンバスの子である既存のアイテムがあります。アイテムのスタイルは、アイテムの色付けに使用できるさまざまなブラシを含むリソース ディクショナリに含まれています。

アイテムのインスタンスが作成されると、デフォルトのカラーリングが与えられます。現在、次のように 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 を更新できるようにしたいと考えています。

アイテムの塗りつぶしプロパティのこの「インプレース」更新を達成するための最良の方法は何ですか?

4

2 に答える 2

2

ブラシが複数の場所で使用されていると想定しているため、 Fill プロパティを設定することはできません。

item.Fill = Brushes.Blue;

その場合、Brush 型の依存関係プロパティを使用して、項目を UserControl またはカスタム コントロールにカプセル化する必要があります。(ブラシの使用に応じて、この Fill を呼び出すことも、AccentFill、OuterBorderFill などのより具体的な名前にすることもできます。) 次に、XAML で、複数回出現するブラシをすべてそのプロパティにバインドします。これで、プロパティを設定できる単一の場所ができました。バインディングを介して、必要なすべての場所に伝播されます

item.AccentFill = Brushes.Blue;

いずれにせよ、重要なことは、「既存のアイテムの XAML を更新する」ことを考えないことです。XAML はシリアル化形式です。既存のアイテムは既にメモリ内の .NET オブジェクトであり、シリアル化されたフォームからリロードする必要なく、プロパティを直接設定できます。

于 2009-11-07T18:55:38.383 に答える
0

私があなたの質問を誤解していない限り、あなたは本当に難しい方法でやっています。なぜこれがうまくいかないのですか?

this.Fill = Brushes.Blue;

または、リソース名を使用することが重要な場合:

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

値を設定してそれで完了できない理由を説明するために、質問を明確にする必要があるかもしれません。

于 2009-11-07T18:59:57.720 に答える