在这篇文章中我们将会为大家介绍一下有关WPF自定义窗口的继承方法。这一方面的知识点对于初学者来说是非常重要的。我们需要牢固掌握这一技巧。#t#
假设我们写好的父窗口类为BaseWindow,对应BaseWindow.cs和BaseWindow.xaml, 要继承它的窗口为Window1,对应Window1.cs和Window1.xaml,我们常常进行的动作是将VS为我们自动生成的代码中的如下语句:
- public partial class
Window1 : Window
修改成:
- public partial class
Window1 : BaseWindow
但编译后,你会得到一个错误:Window1有着不同的基类。
这是因为在window1.xaml中
- < Window
- xmlns="http://schemas.
microsoft.com/winfx/2006
/xaml/presentation"- xmlns:x="http://schemas.
microsoft.com/winfx/2006/xaml"- x:Class="InheritWindow
Demo.Window1"- Width="300" Height="300">
- < Grid x:Name=
"LayoutRoot"/>- < /Window>
我们的WPF自定义窗口继承了Window类,打开Window1.g.cs也可以看到这一点(这是VS自动生成的一个中间文件,可以在Window1的InitializeComponent()方法上“转到定义”来跳转到该文件,也可以在Obj"Debug目录下找到)。这就使得我们的Window1同时继承Window和BaseWindow类,多继承是不被允许的。
那么自然地,需要修改Window1.xaml,将其中的根“Window”,修改成我们的BaseWindow:
- < src:BaseWindow xmlns=
"http://schemas.microsoft.
com/winfx/2006/xaml/presentation"- xmlns:x="http://schemas.
microsoft.com/winfx/2006/xaml"- x:Class="InheritWindowDemo.
Window1"- xmlns:src="clr-namespace:
InheritWindowDemo"- Height="300"
- Width="300">
- < Grid>
- < /Grid>
- < /src:BaseWindow>
心想,这下可以编译通过了吧,抱歉,不行,又得到另一个编译错误:src:BaseWindow不能是Xaml文件的根,因为它是由Xaml定义的,目前我避免这个问题的办法是让BaseWindow仅仅在C#中定义(即,没有BaseWindow.xaml,只有BaseWindow.cs)。
OK,WPF自定义窗口编译顺利通过,继承成功。