gpt4 book ai didi

wpf - 如何嵌套自定义 XAML 元素?

转载 作者:行者123 更新时间:2023-12-04 15:05:32 28 4
gpt4 key购买 nike

<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="Window1">
<Grid>
<local:ElementType x:Name="FirstElementName">
<local:ElementType x:Name="SecondElementName" Grid.Column="1" Grid.Row="1" />
</local:ElementType>
</Grid>
</Window>

这是在其他文件中......
<Grid x:Name="InternalElementName" x:Class="WpfApplication1.ElementType"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1">
</Grid>

和 ...
public partial class ElementType : System.Windows.Controls.Grid { }  

一切正常,除了第二个元素。
我得到错误:
无法在元素“ElementType”上设置名称属性值“SecondElementName”。 “ElementType”在元素“ElementType”的范围内,当它在另一个范围中定义时,它已经注册了一个名称。

自定义网格已正确定义。如果我取出属性,代码将编译并运行---
x:Name="SecondElementName"  

--- 在 Window1.xaml 中

是什么导致了这个错误?我该如何解决?我需要将这些自定义网格中的一个嵌套在另一个网格中,并且我需要它们的名称,以便我可以将它们绑定(bind)到单独的数据。

提前致谢。

最佳答案

为了知道如何处理嵌套标记对象,XAML 解析器将查看 .NET 类是否定义了默认的“内容”属性以用作此类子对象的容器。这是通过“ContentPropertyAttribute”完成的。

在您的情况下,由于我猜您希望嵌套对象进入 Grid 内部,并且由于网格的子项进入“Children”属性集合,因此您只需要执行以下操作:

[ContentProperty("Children")]
public partial class ElementType : Grid
{
// your code here...
}

如果在向控件添加子控件时需要执行一些逻辑(例如,只允许某些类型成为 ElementType 控件的子控件),则可以改为从 IAddChild 继承,并实现 AddChild 和 AddText 方法。

至于命名问题,似乎只有无视控件才能在实例化范围内命名子项。所以基本上,您可以在 ElementType.xaml 中命名子项,但不能在您实例化 ElementType 的其他标记中命名子项。我想这是因为他们优化逻辑树或其他东西的方式。
另一方面,无外观控件是只有代码的控件。所以如果你把你的类变成一个简单的旧的 Grid 空子类,它就可以工作:
public class ElementType : Grid
{
}

耶!代码少!

关于wpf - 如何嵌套自定义 XAML 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1173317/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com