我正在尝试实施以下解决方案:https://stackoverflow.com/a/1486481/154439。在作者的solution中,他写道,
我创建了一个继承自Window的抽象ApplicationWindowBase类。
我不确定他的意思。我尝试将我的XAML从<Window ...
更改为<ApplicationWindowBase ...
。没运气。
窗口的设计器生成的文件继承自System.Windows.Window,但由于该文件是设计器生成的,因此对其进行更改对我没有好处。我尝试了其他各种方法但没有成功。
我对WPF和MVVM都很陌生。我错过了一些明显的东西吗?
答案 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">