2012-01-31 11 views
0

私は、Delphiの世界から来ているWPFの新機能です。私は以下の問題をDelphiの世界で解決しましたが、WPFの世界ではより洗練されたソリューションがあることを願っています。名前でアクセスするウィンドウ

"tree"というメニューを含むXMLファイルを読み込む必要があります。メニューにはウィンドウ名とメニュープロンプトが表示され、その名前に基づいてウィンドウを表示することができます。

例えば、メニューのセグメントは、2つの選択肢が、このようなXMLがあるとします。

<MenuLeaf> 
    <Header>Product information</Header> 
    <MenuLine>  
    <Prompt>Product Master File</Prompt> 
    <WindowName>Products.xaml</WindowName> 
    </MenuLine> 
    <MenuLine>  
    <Prompt>Inventory Data</Prompt> 
    <WindowName>Inventory.xaml</WindowName> 
    </MenuLine> 
</MenuLeaf> 

を、ユーザが「インベントリデータ」の選択肢を作るときに、私は私がやりたいことを知っているだろうウィンドウInventory.xamlの "ショー" .....しかし、私はリテラル文字列 "Inventory.xaml"しか持っていません。

私は、これらの形態に数百を持っていますし、XMLファイルは随時変わることができます - ので、私は数百枚の窓のそれぞれについて、

Dim window as New Inventory 
window.Show 

の標準コードを持っていることは効果的ではありません。私は必要なもの

は、私は運で、このために延々と検索しました

Dim window as New {go out and find the Inventory file with name Inventory.xaml} 
window.Show 

を行うものです。

答えて

1

私は解決策への道があなたのクラスを動的に見つける/呼び出すことを可能にするReflectionを使うことだと思います。ネームスペースがMyNsであるとし、 'Products.xaml'ファイルに対応する 'Products'クラスがその中になければなりません。それを見つけるには、MyFoundType = MyNs.GetType( "Products")を使用してください。
このタイプのデフォルトコンストラクタ(または好きな場合はその他のコンストラクタ)を取得します:MyFoundType.GetConstructor()。次に、必要に応じて引数を指定してコンストラクタを呼び出します。 - >ウィンドウをObjectとして持つようになりました。
これをウィンドウにキャストし、そのShowメソッドを呼び出すと、完了です。

http://msdn.microsoft.com/en-us/library/y0cd10tb.aspx
http://msdn.microsoft.com/en-us/library/h93ya84h.aspx
http://msdn.microsoft.com/en-us/library/6ycw1y17.aspx

+0

私はこれに同意します。 Activator.CreateInstance(type)を使用できるはずです。方法を見つけることを悩まずに。何かが好きです:var win =(Window)Activator.CreateInstance(<アセンブリを取得> .GetType(); – Adam

+0

確かに短いメソッド:-) – GameAlchemist

0

あなたは、実行時にXAMLを解析してオブジェクトを作成するXamlReaderオブジェクトを使用する必要があります。

var rdr = XmlReader.Create(File.Open("Inventory.xaml")); 
var window = XamlReader.Load(rdr) as Window; 
window.Show(); 

XamlReader.LoadはXAMLの実際のトップレベル要素が指定どんな戻ります。 Windowの場合は.Showにすることができます。それは何か他のものなら、あなたはそれを配置するコンテナが必要になりますたとえば、あなたがそれでBorder要素でWindowがある可能性がありますし、実行します。

var control = XamlReader.Load(rdr) as UserControl; 
var window = new MyHostWindow(); 
window.ContentBorder.Child = control; 

をあなたが実際の種類がわからない場合要素をXAMLで使用する場合、通常はすべてのビジュアル要素の基本クラスであるFrameworkElementを使用できますが、ウィンドウ固有の動作は得られません。

+0

ウィンドウのコンストラクタにパラメータがあるとどうしますか? – GameAlchemist

+0

彼は彼が必要とするウィンドウを含むXAMLファイルを持っていると言いました。それが有効なXAMLファイルである限り、XamlReaderはそれを構築します。 XALMの要素は、パラメータのないコンストラクタとパブリックプロパティを持つ必要があります。 コンストラクタでパラメータを必要とするビジュアル要素を作成する場合は、XAMLでそれを実行できず、XamlReaderが機能しません。 –

関連する問題