1

一个普通的 UserControl 在 XAML 中如下所示:

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

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

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

MyControl 派生自 UserControl 本身的位置。

当然,编译器会抱怨找不到“MyControl”。有没有解决的办法?

4

3 回答 3

3

根标签是基类。这就是为什么默认 Window1 的根是 Window。使用菜单选项 Add > 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,并且仅在必须时才制作自定义控件。

祝你好运,

于 2010-03-20T20:08:49.037 回答
0

不。XAML 是在视觉上声明 MyControl 是什么,就像代码隐藏在行为上定义 MyControl 是什么一样。根据 MyControl 定义 MyControl 的视觉效果实际上没有意义:它相当于在代码隐藏中从 MyControl 派生 MyControl,您显然不会这样做。

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

但是,如果您派生的顶级元素是自定义控件,则可以这样做。自定义控件是无外观的(未在 XAML 中定义)。因此,您可以创建自己的顶级元素作为自定义控件,然后从中派生“用户”控件。(如果您确实走这条路,您可能希望从 ContentControl 派生自定义控件或应用 ContentPropertyAttribute,以便您的顶级元素可以轻松包含其他 XAML。)

于 2010-03-20T19:31:34.897 回答
0

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

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

    <my:mycontrol ... />

</Window>
于 2010-03-20T19:00:41.610 回答