我有一个现有的项目是一个画布的子级。该项目的样式被包含在包含可用于着色物品的各种刷子资源字典。

当所述物品的实例被创建它被赋予的默认的着色。我目前不能够直接与填充属性相互作用,如:

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")

也许你需要澄清你的问题解释为什么你不能只是设置的值,并用它来完成。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top