首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XAMLReader就地更新控件

使用XAMLReader就地更新控件
EN

Stack Overflow用户
提问于 2009-11-08 02:41:25
回答 2查看 726关注 0票数 1

我有一个现有的项目,它是画布的子项。项目的样式包含在资源字典中,该资源字典包含可用于为项目着色的各种画笔。

当创建item的一个实例时,它被赋予默认的颜色。我目前不能直接与Fill属性交互,如:

代码语言:javascript
复制
item.Fill = BrushBlue;

出于这个原因,我开始查看该项目的每个实例的XAML。

在创建实例后,我对项目感兴趣的XAML是:

代码语言:javascript
复制
<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的按钮克隆示例:

代码语言:javascript
复制
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属性的“就地”更新的最佳方式是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-11-08 02:55:38

我假设画笔在多个地方使用,这就是为什么您不能只设置Fill属性的原因:

代码语言:javascript
复制
item.Fill = Brushes.Blue;

在这种情况下,您应该做的是使用类型为Brush的依赖项属性将项封装到UserControl或自定义控件中。(根据画笔的使用,您也可以将此填充称为填充,或者可能更具体,例如AccentFill、OuterBorderFill等。)然后在XAML中,将画笔的所有这些多次出现绑定到该属性。现在,您确实有了一个可以设置该属性的位置,通过绑定,它将传播到需要它的所有位置:

代码语言:javascript
复制
item.AccentFill = Brushes.Blue;

在任何情况下,关键的事情都不是“更新现有项的XAML”。XAML是一种序列化格式。您现有的项已经是内存中的.NET对象,您可以直接在其上设置属性,而不需要从序列化的形式重新加载。

票数 2
EN

Stack Overflow用户

发布于 2009-11-08 02:59:58

除非我误解了你的问题,否则你真的很难做到这一点。为什么这不起作用呢?

代码语言:javascript
复制
this.Fill = Brushes.Blue;

或者,如果使用资源名称很重要:

代码语言:javascript
复制
this.Fill = (Brush)FindResource("BlueBrush")

也许你需要澄清你的问题,解释为什么你不能只设置一个值,然后就完成它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1693992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档