普通的UserControl在XAML中看起来像这样:
<UserControl x:Class="mynamespace.foo" ...namespaces...>
<!-- content -->
</UserControl>
我希望能够按照以下方式定义自己的顶级对象:
<MyControl x:Class="mynamespace.mycontrol" ...namespaces...>
<!-- content -->
</UserControl>
MyControl派生自UserControl本身。
当然编译器抱怨没有找到“MyControl”。有办法解决这个问题吗?
答案 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。)