代码之家  ›  专栏  ›  技术社区  ›  luke

XAML中用户定义的顶级控件

  •  1
  • luke  · 技术社区  · 14 年前

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

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

    我希望能够定义自己的顶级对象,大致如下:

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

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

    3 回复  |  直到 14 年前
        1
  •  3
  •   Kep Amun    14 年前

    根标记是基类。这就是为什么默认Window1的根是Window。使用菜单选项Add>用户控件。。。实际上是为usercontrol创建一个子类。

    如果您有一些公共元素并且想要一个控件基类,那么可以使用基类作为根标记。不能从任何具有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">
    

    祝你好运,

        2
  •  0
  •   Scott J    14 年前

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

    <Window ...
        xmlns:my="..." />
    
        <my:mycontrol ... />
    
    </Window>
    
        3
  •  0
  •   itowlson    14 年前

    此外,WPF不允许您从另一个UserControl类派生一个UserControl类,例如,如果BobsControl是UserControl,那么您就不能编写 <local:BobsControl x:Class="MyNamespace.MyControl... /> 任何一个。我相信这是因为UserControls有一个可视化的外观(content)烘焙到它们的XAML中,并且派生类的内容必须替换基类的内容,所以可视化继承通常是没有用的。

    可以 习俗 控制。自定义控件是无外观的(未在XAML中定义)。所以你 可以