WPF用户控件基类问题

11

我是WPF的新手,创建了一个WPF用户控件库。

我添加了一个像这样的基类:

public class TControl : UserControl
{
}

并且希望我所有的控件都从它继承。

我有一个名为Notification的控件,它看起来像:

public partial class Notification : TControl
{
    public Notification()
    {
        InitializeComponent();
    }

每当我重新编译定义了 InitializeComponent() 的隐藏部分类时,它会重新生成并继承自 System.Windows.Controls.UserControl,除此之外一切正常。

这会导致出现以下错误:

Twac.RealBoss.UserControls.Notification 的部分声明不得指定不同的基类

有没有什么方法可以强制生成的类从我的基类继承?

2个回答

25

您的XAML文件可能具有:

<UserControl x:Class="YourNamespace.Notification" .... >

试着将这个更改为:

<Whatever:TControl x:Class="YourNamespace.Notification" xmlns:Whatever="clr-namespace:YourNamespace" />
你得到的错误是由于在XAML中使用UserControl,这告诉编译器生成一个继承自UserControl的部分类,而不是继承自你的类。

几点说明:(1)Whatever的名称不需要与任何内容匹配。(2)必须编写Whatever:BaseClass,而不是控件的直接类。(3)xmlns:Whatever="clr-namespace: YourNamespace"中的命名空间是基类的完整命名空间路径,不包括基类名称本身。(4)基类不需要是部分类。 - Denis G. Labrecque

1
您可以完全删除“:TControl”:
public partial class Notification : TControl
{
}

并写:

public partial class Notification
{
}

相反,由于基类在XAML部分中定义,因此应该采用Paul所写的方法。


完全正确,我把它留在那里只是为了提醒自己它不仅继承自UserControl。TControl目前还没有做任何事情,但将来可能会有所作为。 - aaron
1
此外,我不会使用匈牙利命名法(TControl,而不是Control),与Delphi不同,在C#(或Java或C++)中不建议使用。在Delphi中,它仅在语言不区分大小写时才需要。 - Danny Varod
显然,基类是空的,因为它的内容与问题无关。 - Denis G. Labrecque
@DenisG.Labrecque 当你在多个文件中定义一个类(partial class)时,你不需要重复基类的定义 - 只需要在单个文件中定义它(在这种情况下是自动生成的文件)就足够了。 - Danny Varod
@DannyVarod 我使用基类的目标,正如作者明确表达的目标一样,是为了包含共享的自定义功能。这与类是部分类别无关,因为 x:Name 变量等是由 VS 自动生成以便更容易地引用。 - Denis G. Labrecque
@DenisG.Labrecque 基类在 XAML 中指定,OP 的问题是由于 XAML 和代码不匹配而无法编译。 - Danny Varod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接