私のテストでは、次のような単純なクラスを作成しました。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
namespace Test
{
public class MyCustomWindow: Window
{
}
}
このクラスは dll にコンパイルされます。別のプロジェクトで、このカスタム ウィンドウを次のように使用しようとしました。
<Custom:MyCustomWindow x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Custom="clr-namespace:Test;assembly=Test"
Title="MainWindow" Height="600" Width="1210" WindowState="Maximized" >
<Grid Background="Blue">
<Button Content="Button" HorizontalAlignment="Left" Margin="457,212,0,0" VerticalAlignment="Top" Width="75"/>
</Grid>
このことはエラーなしでコンパイルされ、カスタム ウィンドウが App.xaml ファイルの "StartupUri" (読み込まれた最初のウィンドウを定義する) によって開かれたときにうまく機能します。
ただし、StartupUri で他のウィンドウを読み込むように設定すると、次のようになります。
MainWindow m = new MainWindow();
m.Activate();
m.Show();
this.Close();
CustomWindow が開きますが、コンテンツ、ボタン、青いグリッド、さらにはタイトルもありません。
回避策はありますか?StartupUri と同じ動作で Window を開くにはどうすればよいですか?
編集:
MainWindow (または MyCustomWindow から派生したウィンドウ) は、コンテキストに存在しないため、コンストラクターにメソッド InitializeComponent() を持つことができないことに気付きました。不思議なことに、StartupUri を使用すると、これがなくても正常にコンテンツが読み込まれます。
編集2:
MyCustomWindowにInitializeComponent()メソッドを入れられないために問題が発生していると思います。これは、MainWindow を StartupUri に正常にロードできる理由を説明しています。xaml ファイルから直接ロードしているため、InitializeComponent を必要とせずにコンテンツを解析しています。
IComponentConnector インターフェイスの実装について考え始めましたが、これを行う方法がわかりません。
編集3:
ファイル MainWindow.xaml.cs の分離コードは次のとおりです。
using Test;
namespace TestingCustomWindow
{
public partial class MainWindow : MyCustomWindow
{
public MainWindow()
{
// Cannot use InitializeComponent here
}
}
}