WPF更新控制代替使用XAMLReader
-
18-09-2019 - |
题
我有一个现有的项目是一个画布的子级。该项目的样式被包含在包含可用于着色物品的各种刷子资源字典。
当所述物品的实例被创建它被赋予的默认的着色。我目前不能够直接与填充属性相互作用,如:
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,而不必在画布上创建一个新的项目。
什么是完成项目的填充属性的这种“就地”更新的最佳方法是什么?
解决方案
我认为刷在多个地方被使用,这就是为什么你不能只设置填充属性:
item.Fill = Brushes.Blue;
在这种情况下,你应该做的是封装项目为用户控件或自定义的控制,具有类型刷的依赖项属性。 (根据不同的使用刷的,你也可以称之为填充,也可能是更具体的,例如AccentFill,OuterBorderFill等),然后在您的XAML,绑定刷到该属性的所有那些多次出现。现在,你的不的有一个地方,你可以设置属性,并通过绑定它会传播到需要它的所有地方:
item.AccentFill = Brushes.Blue;
在任何情况下,关键是不要去想“更新现有项目的XAML。” XAML是一个序列化格式。您现有的项目已经是内存中的.NET对象,你可以设置它的属性,而不是直接需要从序列化形式重装。
其他提示
除非我误解你的问题,你的真正的做了艰辛的道路。为什么不这项工作?
this.Fill = Brushes.Blue;
,或者如果它使用资源名称是很重要的:
this.Fill = (Brush)FindResource("BlueBrush")
也许你需要澄清你的问题解释为什么你不能只是设置的值,并用它来完成。
不隶属于 StackOverflow