如何在c#wpf中获取元素的标记?

时间:2014-06-30 13:15:24

标签: c# xml wpf xaml

我正在尝试使用WPF构建GUI,我可以在其中绘制一些基本形状并将它们存储到xml文件中。形状是在xaml文件中设计的,我为每个文件添加了标签。现在我想在我的代码中获取其标签的值,以便在输出xml文件中存储为属性。

例如,我创建了一个矩形形状,其标签名为" RectangleTag"在我的xaml文件中:

<Style x:Key="stack" TargetType="Rectangle" BasedOn="{StaticResource FlowChartRectangleStyle}"/>
    <Style x:Key="stack_DragThumb" TargetType="Rectangle" BasedOn="{StaticResource stack}">
    <Setter Property="IsHitTestVisible" Value="true"/>
    <Setter Property="Tag" Value="RectangleTag"/
</Style>

<Rectangle Style="{StaticResource stack}" ToolTip="stack" StrokeThickness="2">
        <s:DesignerItem.DragThumbTemplate>
        <ControlTemplate>
            <Rectangle Style="{StaticResource stack_DragThumb}" x:Name="StackShape" Tag="RectangleTag" />
        </ControlTemplate>
    </s:DesignerItem.DragThumbTemplate>
</Rectangle>

然后在我的代码中我做了:

XElement myItem = new XElement("Items", 
        from item in designerItems
        let contentXaml = XamlWriter.Save(((DesignerItem)item).Conent)
        select new XElement("Item",
        new XAttribute( "Tag", item.Tag.ToString())
        );

然后我的GUI停止响应此行。我相信必须有一些方法来获取标签,但显然不是这种方式。我怎样才能做到这一点?它不一定是标签,也是x:Namex:Key,它们足以让我区分给定的形状。

我也试过这一行:

new XAttribute("Tag", item.Name)

但是这会给出一个空字符串,而不是xaml文件中指定的名称。有人可以帮忙吗?谢谢。

2 个答案:

答案 0 :(得分:2)

正如Sheridan所说,你正在从错误的方向攻击这个问题。

首先 - 如果你还没有要求阅读:Model-View-ViewModel Explained

您应该创建一组定义形状的Model对象,一组ViewModel对象,它们将它们暴露给View并定义它们的行为,以及一个绑定到ViewModel的View。

这样做的一个关键区别在于,现在你坚持使用XML的逻辑完全不依赖于用户界面,所以你不必尝试使用像Tag这样的东西来传递&#39 ;魔术价值&#39;。

而且,顺便说一句,我发现绝大多数人都依赖于使用Tag作为任何东西,这表明我做错了。 :)

答案 1 :(得分:1)

下面是一个示例:假设您有UI元素是XAML(Button名为_ btn)并且Tag属性设置为某个值,那么在任何事件句柄中(例如Click)与后面的代码中的元素相关联,您可以获得Tag值,如下所示:

_btn.Click+=(s,e,)=>{ string _tag = (s as Button).Tag.ToString(); };

您可以对您的案例应用相同的逻辑。 RGDS,