对WPF窗口使用泛型基类

本文关键字:泛型 基类 WPF 窗口 | 更新日期: 2023-09-27 18:25:03

为什么是

public abstract class WindowControls<T> : Window

不可能。我好像想不通。

    public partial class AnglesteelWindow : WindowControls<AngleSteel> {
    private UCListView uc;
    public AnglesteelWindow() {
        InitializeComponent();
        uc = new UCListView();
        uc.SubmitClick += new EventHandler(ButtonPressed);
        this.uc.grid.PreviewMouseLeftButtonUp +=
            new System.Windows.Input.MouseButtonEventHandler(
                 this.MousePressed14<AngleSteel>);
        stkTest.Children.Add(uc);
        uc.amountLabel.Content = "Milimeter";
        uc.grid.ItemsSource = DatabaseLogic.MaterialTable("Anglesteel").DefaultView;
        base.Material(uc, "Anglesteel");
    }
}

我知道泛型是如何工作的,但不知道为什么不可能从WindowControls派生AnglestelWindow。它给我的错误如下:

"解决方案名称"的基类与其他部分中声明的不同。

当我看到所谓的其他部分时,它是如下所示:

    public partial class AnglesteelWindow : 
          WindowControls<AngleSteel> System.Windows.Markup.IComponentConnector {

这是在AnglestelWindow.g.i.cs文件中创建的。如果我把它从那里移走,那就没有什么区别了。

对WPF窗口使用泛型基类

添加@MichaelMairegger答案,您可以通过创建另一个从泛型类继承的非泛型类来实现目标,如下所示:

public abstract class WindowControlsOfAngleSteel : WindowControls<AngleSteel>
{
}

并使您的窗口类像这样从中继承:

来自XAML:

<ns:WindowControlsOfAngleSteel >
</ns:WindowControlsOfAngleSteel >

其中,ns是存在WindowControlsOfAngleSteel的命名空间。

代码中(可选):

public partial class AnglesteelWindow : WindowControlsOfAngleSteel
{
}

您不能更改继承树。AnglesteelWindow是分部的,因为它也在AnglestelWindow.xaml中声明,其中根元素是Window。如果你想从另一个类继承,你必须用基类替换Window根。

public class MyDerivedBaseWindow : Window {}

<ns:MyDerivedBaseWindow >
    <!-- WindowContent-->
</ns:MyDerivedBaseWindow >

但是不能在XAML中使用泛型类。您必须更改逻辑,即要用作窗口根的基本窗口类是非泛型的。