从WPF MVVM中的Window继承

时间:2013-09-16 17:17:27

标签: wpf vb.net xaml inheritance mvvm

我正在尝试实施以下解决方案:https://stackoverflow.com/a/1486481/154439。在作者的solution中,他写道,

  

我创建了一个继承自Window的抽象ApplicationWindowBase类。

我不确定他的意思。我尝试将我的XAML从<Window ...更改为<ApplicationWindowBase ...。没运气。

窗口的设计器生成的文件继承自System.Windows.Window,但由于该文件是设计器生成的,因此对其进行更改对我没有好处。我尝试了其他各种方法但没有成功。

我对WPF和MVVM都很陌生。我错过了一些明显的东西吗?

2 个答案:

答案 0 :(得分:1)

与凯文的评论一致的代码:

代码背后

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : ApplicationWindowBase
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

<强> XAML

<myPrefix:ApplicationWindowBase x:Class="StackOverflow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:myPrefix="clr-namespace:StackOverflow"
        Title="TestWindow" Height="300" Width="300">
    <Grid>

    </Grid>
</myPrefix:ApplicationWindowBase>

确保使用正确的命名空间,我的恰好是StackOverflow。

答案 1 :(得分:1)

首先,是不是xaml,这些都是类。因此,从其他类(即Window)继承的任何内容都必须与其他类一样继承。

namespace SomeNamespace
{
    public sealed class MyWindow : Window
    {
        public object SomeNewProperty {get;set;}
    }
}

xaml只是一种具有自己的规则的不同类型的序列化。但它仍然是序列化的XML,因此一切都必须可追溯到其原始类型。

xaml是如何通过名为“namespaces”的XML工具完成的。它们非常适合我们作为C#开发人员对命名空间的理解,因为我们必须将XML命名空间映射到应用程序中的命名空间,以便xaml序列化程序可以将XML元素与CLR类型匹配。

Xaml使用几种不同的方式来匹配这些命名空间。一个看起来像一个URL并由一个程序集属性定义(例如,“xmlns =”http://microsoft.com/whatevs“)。当程序集在你正在写入的程序集的外部时,这是有效的。在你的情况下,你将不得不使用另一种识别命名空间的方法。这个专门的XML命名空间由xaml序列化程序解析,以识别命名空间并包含类的程序集。它的形式为“clr-namespace:SomeNamespace; assembly” = SomeAssembly“。如果类型在当前程序集中,则可以省略程序集位。

要将所有内容与上面的示例结合在一起,您将创建一个新窗口的实例,如下所示:

<t:MyWindow 
    xmlns:t="clr-namespace:SomeNamespace" 
    xmlns="the standard microsoft namespace here"
    t:OmitOtherStuffBecauseThisIsAnExampleLol="true">