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;

在这种情况下,您应该将项目封装到 UserControl 或自定义控件中,并使用 Brush 类型的依赖属性。(根据画笔的用途,您也可以调用此 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 回答