C# 在WPF/XAML中只允许某些类型的子级?

C# 在WPF/XAML中只允许某些类型的子级?,c#,wpf,.net-4.0,C#,Wpf,.net 4.0,在我的一个应用程序中,我需要允许用户以某种方式自定义用户界面。为此,我允许用户在XAML中指定用户界面,在应用程序启动时动态加载该界面。这个很好用 现在,我想为用户提供自定义控件,它来自Border(我们称之为MyFrame) 我需要确保MyFrame可能不是另一个MyFrame的子对象,因此应防止以下情况: <ns:MyFrame> <Grid> <ns:MyFrame /> </Grid> </ns:MyF

在我的一个应用程序中,我需要允许用户以某种方式自定义用户界面。为此,我允许用户在XAML中指定用户界面,在应用程序启动时动态加载该界面。这个很好用

现在,我想为用户提供自定义控件,它来自
Border
(我们称之为
MyFrame

我需要确保
MyFrame
可能不是另一个
MyFrame
的子对象,因此应防止以下情况:

<ns:MyFrame>
    <Grid>
        <ns:MyFrame />
    </Grid>
</ns:MyFrame>


我应该如何实现这一点?

您将无法在编译时实现这一点


但是,在运行时,您可以在创建MyFrame的新实例时使用检查MyFrame是否有父MyFrame。如果出现异常,则引发异常。

您将无法在编译时执行此操作


但是,在运行时,您可以在创建MyFrame的新实例时使用检查MyFrame是否有父MyFrame。如果出现异常,则引发异常。

我将抛出一个异常,并从MyFrame上的事件处理程序发出一条明确的消息:逐步遍历新MyFrame实例的祖先,并尝试找到另一个;如果确实找到了一个,则抛出异常

备选方案:使用在MyFrame的所有实例上设置的可继承附加属性,并在加载的处理程序中检查该属性


我无法想象以静态方式强制执行规则的任何方式。

我会抛出一个异常,并从MyFrame上的事件处理程序发出一条明确的消息:逐步遍历新MyFrame实例的祖先,并尝试找到另一个;如果确实找到了一个,则抛出异常

备选方案:使用在MyFrame的所有实例上设置的可继承附加属性,并在加载的处理程序中检查该属性


我无法想象以静态方式强制执行规则的任何方式。

它并不总是有效(在我的经验中+-70%的情况下),但它绝对是一个有效的尝试选项。你说它不总是有效是什么意思?当然,我想要一个在所有情况下都有效的解决方案。否则我可能会节省时间,而不会实现它……事实上,Tigran可能在使用我提供的链接中提供的方法时遇到了问题,因为您必须小心XAML实例化顺序:如果您尝试在检查后找到实例化的内容,您可能什么也找不到,而应该有一些内容。记住这一点,这是一个100%的解决方案=)我从您提供的链接中使用了
TryFindParent
方法,并在
MyFrame
OnVisualParentChanged
方法中调用它。因此,当孩子被(重新)分配给父母时,我正在检查父母是否存在。在这种情况下,我认为两者都是创建的,这应该是可行的。它并不总是可行的(在我的经验中+-70%的情况下),但这绝对是一个有效的尝试选项。你说它不总是可行是什么意思?当然,我想要一个在所有情况下都有效的解决方案。否则我可能会节省时间,而不会实现它……事实上,Tigran可能在使用我提供的链接中提供的方法时遇到了问题,因为您必须小心XAML实例化顺序:如果您尝试在检查后找到实例化的内容,您可能什么也找不到,而应该有一些内容。记住这一点,这是一个100%的解决方案=)我从您提供的链接中使用了
TryFindParent
方法,并在
MyFrame
OnVisualParentChanged
方法中调用它。因此,当孩子被(重新)分配给父母时,我正在检查父母是否存在。在这种情况下,我认为这两个都是创建的,这应该可以工作。这就是我接受他的答案的原因。当然:)我必须重新注册,因为我忘了我的旧用户/通行证,所以他抢先给了我。他说,当我按照你的建议做的时候,我在Baboon的链接中找到了代码。这就是我接受他的答案的原因。当然:)我必须重新注册,因为我忘了我的旧用户/通行证,所以他抢先给了我,呵呵