如何在WPF窗口中访问继承的成员?

时间:2019-07-28 12:23:04

标签: c# wpf inheritance window

我试图在WPF应用程序中为我的窗口创建一个基类,但是我无法访问它们在派生类中的成员。例如,这是基本窗口:

namespace MyApp.Windows
{
    public class BaseWindow : Window
    {
        public int MyProp { get; set; }
    }
}

这是一个窗口:

public partial class SomeWindow : BaseWindow
{
    public SomeWindow()
    {
        InitializeComponent();
        Loaded += SomeWindow_Loaded;
    }

    private void SomeWindow_Loaded(object sender, RoutedEventArgs e)
    {
        MyProp = do something;
    }
}

如果我这样保留它,MyProp属性就可以正常工作,但是我收到一个错误,指出无法识别InitializeComponent()。因此,在xaml窗口中,按如下所示更改x:Class: 之前

<Window x:Class="MyApp.SomeWindow"

之后

<Window x:Class="MyApp.Windows.BaseWindow"

现在,InitializeComponent()不再给我任何问题,但是MyProp突然不被认可。为什么?

如果有帮助,我想要的是让所有窗口在加载后引发一个事件(触发Loaded事件),并且我不想为我拥有的每个窗口编写此代码,所以我想我可以在一个基类中编写此代码,从中派生我的窗口,然后一切正常。

编辑:这是所有代码。 BaseWindow.cs(没有其他xaml):

using System.Windows;

namespace MyApp.Windows
{
    public class BaseWindow : Window
    {
        public int MyProp { get; set; }
    }
}

MainWindow.xaml.cs

namespace MyApp.Windows
{
    public partial class MainWindow : BaseWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

MainWindow.xaml:

<myapp:BaseWindow x:Class="MyApp.Windows.BaseWindow"
        xmlns:myapp="clr-namespace:MyApp.Windows"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>

    </Grid>
</myapp:BaseWindow>

1 个答案:

答案 0 :(得分:0)

为了将SomeWindow的基类从Window更改为BaseWindow,您需要将Window替换为BaseWindow,无论它在哪里出现。

所以

public partial class SomeWindow : Window

成为

public partial class SomeWindow : BaseWindow

<Window x:Class="MyApp.Windows.SomeWindow" ...>

成为

<myapp:BaseWindow x:Class="MyApp.Windows.SomeWindow"
                  xmlns:myapp="clr-namespace:MyApp.Windows" ...>

带有不可避免的XAML名称空间前缀。


这是上面示例中使用的BaseWindow类:

namespace MyApp.Windows
{
    public class BaseWindow : Window
    {
        public int MyProp { get; set; }

        public BaseWindow()
        {
            Loaded += BaseWindow_Loaded;
        }

        private void BaseWindow_Loaded(object sender, RoutedEventArgs e)
        {
        }
    }
}