通常の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を削除する必要があると思います。しかし、とにかくそれは今動作します。