0

次のソリューションを実装しようとしています: https://stackoverflow.com/a/1486481/154439。著者のソリューションでは、彼は次のように書いています。

Window を継承する抽象 ApplicationWindowBase クラスを作成しました。

彼がここで何を意味しているのか私にはわかりません。XAML を から<Window ...に変更してみました<ApplicationWindowBase ...。運がない。

ウィンドウ用にデザイナーが生成したファイルは System.Windows.Window から継承されますが、そのファイルはデザイナーが生成したものであるため、これを変更しても何の役にも立ちません。私は他のさまざまなアプローチを試みましたが、成功しませんでした。

私はWPFとMVVMの両方に非常に慣れていません。明らかな何かが欠けていますか?

4

2 に答える 2

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 です。

于 2013-09-16T18:02:58.307 に答える
1

まず、xaml であろうとなかろうと、これらはすべてクラスです。したがって、別のクラス (つまり Window) から継承するものはすべて、他のクラスと同様に継承する必要があります。

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

xaml は、独自のルール セットを持つ別の種類のシリアル化です。しかし、それでもシリアライズされた XML であるため、すべてを元の型まで追跡できる必要があります。

xaml がこれを行う方法は、「名前空間」と呼ばれる XML の機能を使用することです。Xaml シリアライザーが XML 要素を CLR 型と一致させることができるように、XML 名前空間をアプリケーションの名前空間にマップする必要があるため、C# 開発者としての名前空間の理解にうまく適合します。

Xaml は、これらの名前空間を一致させるためにいくつかの異なる方法を使用します。One look like a URL and is defined by an assembly attribute (eg, "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">
于 2013-09-16T18:03:17.240 に答える