【问题标题】:How can I access inherited members in a WPF window?如何在 WPF 窗口中访问继承的成员?
【发布时间】:2023-03-10 10:52:01
【问题描述】:

我正在尝试在 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 proerty 工作得很好,但我收到一个错误,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>

【问题讨论】:

    标签: c# wpf inheritance window


    【解决方案1】:

    为了将 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)
            {
            }
        }
    }
    

    【讨论】:

    • 好吧,BaseWindow 类是在命名空间MyApp.Windows 中定义的,所以我将myapp 定义为xmlns:myapp="clr-namespace:MyApp.Windows" 但现在它说The name "BaseWindow" does not exist in the namespace "clr-namespace:MyApp.Windows".
    • 我也编辑了我的问题。我可以看到您的示例和我的示例之间的唯一区别是您有x:Class="MyApp.SomeWindow",而我有x:Class="MyApp.Windows.SomeWindow"。如果我删除.Windows,我会再次收到缺少的 InitializeComponent 错误。
    • 您的 MainWindow 类位于命名空间 MyApp.Windows 中。所以它当然必须是x:Class="MyApp.Windows.MainWindow"
    • 傻我...谢谢!
    猜你喜欢
    • 2015-08-24
    • 2014-06-12
    • 2019-06-01
    • 2011-06-02
    • 2023-03-26
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多