WPF中的多态性

本文关键字:多态性 WPF | 更新日期: 2023-09-27 18:01:50

我希望在WPF中创建一些抽象的东西。你有一个有两个按钮的主窗口(例如,叫做main,即使它不正确,我们也不在乎)。这两个按钮有相同的功能:它们打开一个新窗口,它们都是一样的,但里面的东西不同。所以我决定创建一个抽象类来管理它们:

public abstract (partial ?) class A : Window
{
    public A()
    {
        InitializeComponent(); // Not sure about that, it's kinda weird to use it here no ?
    }
    ...
}
public partial class B : A
{
    public B()
    {
        InitializeComponent(); // Since it's already in A I shouldn't have to use it here right ?
    }
    ...
}
public partial class C : A
{
    public C()
    {
        InitializeComponent(); // Same thing here...
    }
    ...
}

调试给了我类似:"错误CS0263:部分声明的命名空间。B'不能指定不同的基类'。

从A类中删除'partial'会产生:"错误CS0260:在类型'namespace.A'的声明中缺少partial修饰符;该类型的另一个部分声明存在".

我知道'partial'指定如果一个类在其他地方有她的另一部分(就像cs旁边的xaml文件),所以我想抽象类也必须是部分的,因为它包含了我的控件。也许B类不应该是局部的?

我知道(记忆)它与Windows窗体一起工作,但是没有xaml文件,所以更容易,我没有找到任何有用的提示。我想我理解这个问题发生时,我不改变我的xaml文件的东西,这并不像"类:抽象类"一样简单。也许是子类的东西?

请注意,我是WPF应用程序的初学者,所以如果你的回答尽可能详细,我提前感谢你。

谢谢!

WPF中的多态性

您需要在代码中定义您的基类,而不使用XAML:

A类代码:

public abstract class A : Window { }

B类代码:

public partial class B : A
{
    public B()
    {
        InitializeComponent();
    }
}

xaml for class B:

<yourNamespace:A x:Class="yourNamespace.B"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:yourNamespace="clr-namespace:yourNamespace"...

c#部分类是在两个或多个源文件上定义的类。windows的其他"部分"是由Visual Studio生成的,包括InitializeComponent()

如果你想要一个窗口基类,那么它必须完全在代码中定义,并且没有XAML组件。它将不再是一个分部类。

public abstract class WindowA : Window
{
    // define base methods here
}

那么你可以从windowwa派生出WindowB:

public partial class WindowB : WindowA
{
    public WindowB()
    {
        InitializeComponent();
    }
}

但是你也需要在其他"部分"中这样做,即在XAML中,所以在WindowB的XAML文件中,根窗口标签需要更改为:

<wpfApp:WindowA x:Class="WpfApp.WindowB"
        wpfApp:WindowA ="clr-namespace:WpfApp"

(您需要适当地更改名称空间)

这将生成从windowwa派生的其他"部分",因此不会有不一致。

InitializeComponent()方法应该在每个派生类的构造函数中调用,因为它是特定于该类的,即在这种情况下,其他"部分"是由XAML生成的,并定义了InitializeComponent()与特定于WindowB的resourceLocator代码