2

デスクトップアプリケーションのナビゲーション部分に取り組んでいますが、少し問題があります。要求は、ナビゲーションを動的にすることです。これにより、たとえば、再コンパイルせずにビューの順序を切り替えることができます(理想的には、再コンパイルせずにビューを追加することもできます)。

現在、XMLを使用して、表示するウィンドウ、表示するヘッダー、およびフッターの外観を定義しています。XMLは次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<ArrayOfViewState xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <ViewState ViewName="WelcomeView" Header="Welcome to the Application" FooterButton1="Quit" FooterButton2="Back" FooterButton3="Next" />
  <ViewState ViewName="LicenseView" Header="Licence Agreement" FooterButton1="Quit" FooterButton2="Back" FooterButton3="Next" />
  <ViewState ViewName="LoginView" Header="Log in" FooterButton1="Quit" FooterButton2="Back" FooterButton3="Next" />
  <ViewState ViewName="InstallationView" Header="Installing..." FooterButton1="Cancel" FooterButton2="None" FooterButton3="Next" />
  <ViewState ViewName="UpdateView" Header="Updating..." FooterButton1="Cancel" FooterButton2="None" FooterButton3="Next" />
  <ViewState ViewName="FinishedView" Header="Finished!" FooterButton1="None" FooterButton2="None" FooterButton3="Finish" />
</ArrayOfViewState>

そして、コードでこれを一致させると、次のようになります(viewState.ViewのタイプはUserControlです)。

...
case "WelcomeView":
  viewState.View = new WelcomeView();
...

ご覧のとおり、XMLのViewNameプロパティを使用して、ビューを照合および作成します(ViewModelもありますが、XAMLおよびMVVM Light ViewModelロケーターによって処理されます)。

このソリューションでは、技術的には、再コンパイルせずにナビゲーションをいくらか変更できます(たとえば、順序を好きなようにシャッフルできます)が、文字列プロパティを照合するよりも、これを処理するためのより良い方法が必要です。他のプロパティと一緒にロードできるように、ユーザーコントロールのシリアル化を検討しましたが、これまでのところうまくいきませんでした。これをどのように進めて改善/変更するかについてのアイデアはありますか?

ありがとう!

4

2 に答える 2

2

実際、もっと良い方法があります。:-)

Microsoft Extensibility Framework (MEF)をご覧ください。WPF と MVVM で非常にうまく機能します。

これにより、実行中にオンザフライでアプリケーションパーツを簡単に作成できます。

つまり、別の場所にロードしたいクラスを Attribute でマークします[Export]

[Export(typeof(ViewContainer))]
public class ViewContainer
{
   public string ViewName = "WelcomeView";
   public string Header="Welcome to the Application"

   // Do more stuff here
}

また、エクスポートされたクラスを使用する必要があるクラスまたはアセンブリでは、[Import]属性を使用してそれをロードできます。

public class ClassInOtherAssembly
{
   [ImportMany]
   internal ObservableCollection<ViewContainer> m_MyViews { get; set; }

   // Do other stuff here
}

実装するアーキテクチャによっては、ワンライナー (!) を使用してインポートされたすべてのクラスをアセンブルするだけで十分な場合もあります (これは、次の参照チュートリアルとは異なるアプローチを使用します)。

CompositionInitializer.SatisfyImports(this);

以上です!

(これらの例をそのままとらないでください。要点を説明したかっただけです。クラス エクスポートの代わりに and を使用することをお勧めし Propertiesますstringsinterfacesネット上には、よりエレガントなスニペットがたくさんあります。:-) )

ここでは、開始するためのチュートリアルを見つけることができます: Managed Extensibility Framework (MEF)の概要

于 2012-04-23T14:52:26.220 に答える
0

リフレクションを使ってみませんか?

Activator.CreateInstanceビューの文字列を使用して渡すことができます。

string asmName = "YourAssembly";
string typeName = "YourViewName";

object obj = Activator.CreateInstance(asmName, typeName).Unwrap() as UserControl;
于 2012-04-23T14:14:37.573 に答える