C# - WPF - 更改窗口的继承



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类现在存在,现在我让我的窗口wndLoginBaseWindow继承 - 所以像这样

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 约定(,您可以创建具有这些属性的基本视图模型,并将窗口类HeightWidth绑定到这些视图模型属性。就个人而言,这就是我处理这个问题的方式,而不是为 Windows 创建一个新的基类。

最新更新