我正在尝试使用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:Name
或x:Key
,它们足以让我区分给定的形状。
我也试过这一行:
new XAttribute("Tag", item.Name)
但是这会给出一个空字符串,而不是xaml文件中指定的名称。有人可以帮忙吗?谢谢。
答案 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,