用户在XAML中定义了顶级控件

时间:2010-03-20 18:56:24

标签: wpf xaml user-controls user-defined

普通的UserControl在XAML中看起来像这样:

<UserControl x:Class="mynamespace.foo" ...namespaces...>
<!-- content -->
</UserControl>

我希望能够按照以下方式定义自己的顶级对象:

<MyControl x:Class="mynamespace.mycontrol" ...namespaces...>
<!-- content -->
</UserControl>

MyControl派生自UserControl本身。

当然编译器抱怨没有找到“MyControl”。有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

root标记是基类。这就是默认Window1的根是Window的原因。使用菜单选项添加&gt; UserContol ...实际上正在为UserContol创建一个子类。

如果您有一些常见元素并且需要控件基类,则可以使用基类作为根标记。您无法从具有xaml定义的可视化树的任何类派生您的类,但您的基类可以从UserConrtol派生。

首先定义你的基类:

public class MyControlBase : UserControl
{
    // ...
}

然后创建您的特定子类:

(您可以从自动创建的UserControl1开始,然后从那里进行更改)

public partial class MyControl1 : MyControlBase
{
    public MyControl1()
    {
        InitializeComponent();
    }
}

然后将Xaml侧更改为:

<MyNamespace:MyControlBase
    x:Class="MyNamespace.MyControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:MyNamespace="clr-namespace:MyNamespace">

这是一种很好的方法,可以使用UserControl之外的内置控件派生自定义控件。如果可以的话,通常建议只使用基本的UserConrtols,并且只在必要时才进行自定义控制。

祝你好运,

答案 1 :(得分:0)

在XAML中定义命名空间,然后使用控件名称作为标记:

<Window ...
    xmlns:my="..." />

    <my:mycontrol ... />

</Window>

答案 2 :(得分:0)

没有。 XAML正在声明MyControl的视觉效果,就像代码隐藏定义了MyControl的行为一样。根据MyControl定义MyControl的视觉效果并不合理:它在代码隐藏中相当于从MyControl派生MyControl,你显然不会这样做。

此外,WPF不允许您从另一个派生一个UserControl类,例如如果BobsControl是UserControl,那么你也不能写<local:BobsControl x:Class="MyNamespace.MyControl... />。我相信这是因为UserControls在他们的XAML中有一个视觉外观(内容),并且派生类的内容必须替换基类的内容,因此视觉继承通常没用。

但是,如果您从中派生的顶级元素是自定义控件,则可以执行此操作。自定义控件是无外观的(未在XAML中定义)。所以你可以创建自己的顶级元素作为自定义控件,然后从中派生“用户”控件。 (如果您沿着这条路线前进,您可能希望从ContentControl派生自定义控件或应用ContentPropertyAttribute,以便您的顶级元素可以轻松地包含其他XAML。)