我试图在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>
答案 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)
{
}
}
}