1

通常のWPFアーキテクチャ:

public partial class MainWindow: Window {

... InitializeComponent()

}

XAML: <Window x:Class="MainWindow"> </Window>

移動したいもの:

public abstract class BaseWindow: Window {

    public System.Windows.Controls.TextBlock control1;
    public System.Windows.Shapes.Rectangle   control2;
    public System.Windows.Controls.TextBox   control3;

}

public partial class AWindowImplementation {

... InitializeComponent()

}

public partial class AnotherWindowImplementation{

... InitializeComponent() 

}

 XAML:
 <BaseWindow x:Class="AWindowImplementation"> </BaseWindow>
 <BaseWindow x:Class="AnotherWindowImplementation"> </BaseWindow>

上記は擬似コードです。この新しいアーキテクチャはコンパイルされ、実装がコントロールの定義を非表示にするという警告が表示されます('override'キーワードを配置する場所が自動生成されたInitializeComponentを使用しているため)。残念ながら、コントロールフィールドは入力されません。

これは達成可能ですか?私がやろうとしているのは、同じインターフェイス/コントロールを使用して複数のUIデザインを作成し、残りのコードがどちらのデザインとも相互作用できるようにすることです。

編集:pchajerとYevgeniyのおかげで、次の実用的な解決策がありますが、それでもオーバーライド警告が表示されます:

 public class MainWindowBase : Window
 {
     public TextBlock control1;
     public Rectangle control2;
     public TextBox   control3;

    static MainWindowBase()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MainWindowBase),
                   new FrameworkPropertyMetadata(typeof(MainWindowBase)));
    }

    public override void OnApplyTemplate()
    {
        control1 = (TextBlock) FindName("control1");
        control2 = (Rectangle) FindName("control2");
        control3 = (TextBox)   FindName("control3");
    }

 }   

 <Style TargetType="{x:Type views:MainWindowBase}" 
           BasedOn="{StaticResource {x:Type Window}}">
     <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type views:MainWindowBase}">
                    <ContentPresenter />                                 
            </ControlTemplate>
        </Setter.Value>
     </Setter>
     </Style>

 public partial class AWindowImplementation :MainWindowBase {

 ... InitializeComponent()

}

 <MainWindowBase x:Class="AWindowImplementation"> </MainWindowBase>

警告を取り除くには、基本クラスで異なるフィールド名を使用するか、派生クラスのInitializeComponentを削除する必要があると思います。しかし、とにかくそれは今動作します。

4

3 に答える 3

2

WPFでは、Windowから継承し、XAMLを持つBaseクラスを作成できます。しかし、職場があります

このリンクを参照してください-一般的なWPFベースウィンドウスタイルを作成するにはどうすればよいですか?

于 2012-06-21T15:15:40.553 に答える
0

を呼び出しているものがないため、擬似コードがどのように機能するかはわかりませんInitializeComponent。通常、WPFは、ウィンドウのコンストラクターでユーザーに代わって呼び出します。しかし、あなたの場合、(オーバーライドではなく)新しい実装を追加していて、何もそれを呼び出していません。

1つのオプションは、各サブクラスコンストラクターから新しい実装を呼び出すことです。例えば。AWindowImplementationのコンストラクタはを呼び出すことができますthis.InitializeComponent()

もう1つのオプションは、コンストラクターが呼び出すBaseWindow仮想メソッド(たとえば)を定義することです。InitializeComponentCoreその後、基本クラスはそのメソッドをオーバーライドできます。

于 2012-06-21T14:48:45.280 に答える
0

Windowの基本クラスをカスタムコントロールとして定義する必要があります。新しいカスタムコントロールを作成し、基本クラスをWindowに設定してから、blendからスタイルを挿入するだけです(コンポーネントを追加できます)。pchajerからの回答も参照してください。

于 2012-06-22T03:33:04.090 に答える