Hello StackOverflow community,
我收到了有关 WPF 窗口继承的问题。
如果你创建一个新窗口,它会继承自System.Windows.Window - 所以让我们说:我希望我使用的每个窗口在他的构造函数中都有以下代码:
MinHeight = Height;
MinWidth = Width;
所以我的第一次尝试是创建一个名为 BaseWindow 的新类,并将代码块放入BaseWindow的构造函数中(这种方法我也经常用于表单应用程序,它在那里工作(。
namespace MyProject.Classes
{
public class BaseWindow : System.Windows.Window
{
public BaseWindow()
{
MinHeight = Height;
MinWidth = Width;
}
}
}
我的 BaseWindow类现在存在,现在我让我的窗口wndLogin从BaseWindow继承 - 所以像这样:
using MyProject.Classes;
namespace MyProject
{
public partial class wndLogin : BaseWindow
{
public wndLogin()
{
InitializeComponent();
InitializeWindow();
}
private void InitializeWindow()
{
// Initializing window specific stuff
}
}
}
我注意到这个类是部分的,所以我还在文件wndLogin.g.i.cs中更改了类另一部分的继承 - 它在那里说,这个文件是一个自动生成的文件,不应该被编辑。
namespace MyProject {
/// <summary>
/// wndLogin
/// </summary>
public partial class wndLogin : System.Windows.Window, System.Windows.Markup.IComponentConnector {
// auto generated stuff here
}
}
当我编辑它时,它会在调试项目后→System.Windows.Window的标准继承替换我的自定义继承。
有没有办法禁用这个自动生成的代码或告诉Visual Studio它应该使用其他类进行继承?
提前感谢! :-(
不要手动编辑wndLogin.g.i.cs
,它是自动生成的(正如你发现的那样(。
为此,您还需要更改 XAML 文件以使用窗口:
<local:BaseWindow x:Class="MyNamespace.Window1"
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:MyNamespace"
mc:Ignorable="d"
Title="Window1">
<Grid>
</Grid>
</local:BaseWindow>
请注意<local:BaseWindow ...
而不是Window
。如果BaseWindow
类位于完全不同的命名空间中,则需要在 xaml 中指定该命名空间:
<baseWindowNs:BaseWindow x:Class="MyNamespace.Window1"
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:MyNamespace"
xmlns:baseWindowNs="clr-namespace:MyProject.Classes"
mc:Ignorable="d"
Title="Window1">
<Grid>
</Grid>
</baseWindowNs:BaseWindow>
关键行是命名空间限定符:xmlns:baseWindowNs="clr-namespace:MyProject.Classes"
,然后使用命名空间名称代替第一个示例中的local
。
唯一需要的其他更改是从新基类继承的WindowName.xaml.cs
文件:
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : BaseWindow
{
public Window1()
{
InitializeComponent();
}
}
或者(更符合 WPF MVVM 约定(,您可以创建具有这些属性的基本视图模型,并将窗口类Height
和Width
绑定到这些视图模型属性。就个人而言,这就是我处理这个问题的方式,而不是为 Windows 创建一个新的基类。