我有一个现有的项目,它是画布的子项。项目的样式包含在资源字典中,该资源字典包含可用于为项目着色的各种画笔。
当创建item的一个实例时,它被赋予默认的颜色。我目前不能直接与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属性的“就地”更新的最佳方式是什么?
发布于 2009-11-08 02:55:38
我假设画笔在多个地方使用,这就是为什么您不能只设置Fill属性的原因:
item.Fill = Brushes.Blue;在这种情况下,您应该做的是使用类型为Brush的依赖项属性将项封装到UserControl或自定义控件中。(根据画笔的使用,您也可以将此填充称为填充,或者可能更具体,例如AccentFill、OuterBorderFill等。)然后在XAML中,将画笔的所有这些多次出现绑定到该属性。现在,您确实有了一个可以设置该属性的位置,通过绑定,它将传播到需要它的所有位置:
item.AccentFill = Brushes.Blue;在任何情况下,关键的事情都不是“更新现有项的XAML”。XAML是一种序列化格式。您现有的项已经是内存中的.NET对象,您可以直接在其上设置属性,而不需要从序列化的形式重新加载。
发布于 2009-11-08 02:59:58
除非我误解了你的问题,否则你真的很难做到这一点。为什么这不起作用呢?
this.Fill = Brushes.Blue;或者,如果使用资源名称很重要:
this.Fill = (Brush)FindResource("BlueBrush")也许你需要澄清你的问题,解释为什么你不能只设置一个值,然后就完成它。
https://stackoverflow.com/questions/1693992
复制相似问题