继承自 WPF MVVM 的 Window

22 浏览
0 Comments

继承自 WPF MVVM 的 Window

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

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

我不确定他在这里的意思。我尝试将我的XAML从更改为,但没有成功。

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

我对WPF和MVVM都非常陌生。我是否遗漏了一些明显的东西?

0
0 Comments

在WPF MVVM中从Window继承的问题是由于XAML的命名空间匹配引起的。XAML是一种序列化的XML,因此在XAML中的所有元素都必须能够追溯回其原始类型。

XAML通过XML中的命名空间机制来实现这一点。命名空间在我们作为C#开发人员的理解中是有用的,我们必须将XML命名空间映射到我们应用程序中的命名空间,以便XAML序列化器可以将XML元素与CLR类型匹配。

XAML使用了几种不同的方法来匹配这些命名空间。一种方法类似于URL,并且通过程序集属性来定义(例如,"xmlns="http://microsoft.com/whatevs")。当程序集是外部程序集时,这种方法是有效的。在你的情况下,你需要使用另一种方法来标识你的命名空间。这种特殊的XML命名空间由XAML序列化器解析,以识别命名空间和包含类的程序集。它的形式是"clr-namespace:SomeNamespace;assembly=SomeAssembly"。如果类型在当前程序集中,可以省略程序集部分。

以上面的示例为例,你可以像这样创建一个新窗口的实例:


因此,要解决从Window继承的问题,你需要在XAML中正确地定义命名空间,并确保命名空间与包含类的程序集匹配。

0
0 Comments

原因:在WPF MVVM中,通常我们会创建一个基类,用于实现通用的窗口逻辑,然后让窗口类继承这个基类。然而,在这个例子中,MainWindow类继承自ApplicationWindowBase,而不是Window类,这可能会导致一些问题。

解决方法:根据评论中的代码,我们可以看到MainWindow类继承自ApplicationWindowBase,而不是Window类。为了解决这个问题,我们可以将MainWindow类改为继承自Window类。这样,MainWindow将成为一个标准的WPF窗口,并且不会出现继承问题。

文章内容如下:

在WPF MVVM中,我们通常会创建一个基类,用于实现通用的窗口逻辑。然而,在某些情况下,继承问题可能会出现。在下面的例子中,MainWindow类继承自ApplicationWindowBase,而不是Window类,这可能会导致一些问题。

首先,让我们看一下例子中的代码:

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


    
    

从代码中可以看出,MainWindow类继承自ApplicationWindowBase,而不是标准的WPF窗口类Window。这可能会导致一些问题。

为了解决这个问题,我们只需将MainWindow类改为继承自Window类。修改后的代码如下:

/// 
/// Interaction logic for MainWindow.xaml
/// 
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
}

通过这样的修改,MainWindow将成为一个标准的WPF窗口,继承问题也将得到解决。

希望这篇文章可以帮助到你。如果你还有其他问题,请随时提问。

0