创建一个不直接从WPF Window派生的窗口实例

时间:2011-05-30 09:24:24

标签: wpf xaml inheritance

我有以下类的层次结构:

abstract MyWindowBase : System.Windows.Window(即WPF一个)

MyWindow : MyWindowBase

我想在XAML中创建一个类型为MyWindow的Window作为根元素。我发现只有这样做:

<local:MyWindowBase
    x:Class="MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    local:x="clr-namespace:MyProjectNamespace">

    <local:MyWindowBase.Resources>...</local:MyWindowBase.Resources>

    ...

</local:MyWindowBase>

即。我将我的抽象类型指定为根元素,这看起来很尴尬。

我也尝试过这种明显的方式:

<Window
    x:Class="MyWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    ...
</Window>

并在代码隐藏中定义MyWindow : MyWindowBase,但它与生成的文件中的类定义冲突,后面写着MyWindow : Window

有更好的方法吗? 感谢

3 个答案:

答案 0 :(得分:1)

检查this recent post of mine,它解释了这种事情 - 如何从另一个页面派生出一个页面(方法完全相同)。

答案 1 :(得分:0)

没有什么可以阻止你在这里拥有你想要的任何层次结构。根元素是基类型,x:Class是您当前定义的生成类型。

如果您希望将特定类调用MyWindow并从MyWindowBase派生,那么您的第一个示例是正确的:

<local:MyWindowBase
    x:Class="MyWindow"
    local:x="clr-namespace:MyProjectNamespace">

如果您希望特定类来自MyWindow 派生,那么您需要一个不同的类名:

<local:MyWindow
    x:Class="MainWindow"
    local:x="clr-namespace:MyProjectNamespace">

答案 2 :(得分:0)

这是正常用法。实际上,您使用Visual Studio或Blend创建的默认类来执行相同的操作。

请注意,您继承自Window,因此实际的类是 MainWindow ,但xaml使用基类 Window

C#

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

的Xaml

<Window
  x:Class="MainWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  ...
</Window>