2012-04-17 22 views
2

MYアプリケーションには3ページ(単純な選択が行われた1つのMainWindowと2ページ)があります。同じウィンドウ内のビューの切り替えページの新規インスタンスを作成せずにWPF

現在、私はhttp://azerdark.wordpress.com/2010/04/23/multi-page-application-in-wpf/のページを切り替えるために次のナビゲーション構造を使用しています。 基本的には、インターフェースを使用してページの参照を渡し、新しいインスタンスを作成します。

私は1つのウィンドウを一度に開くことしかできません。たとえば、ページAからBにナビゲートすると、Bの内容がAの内容に置き換えられます。注文は常にA→B→C→A(メインウィンドウに戻る)またはA→B→Aです。

すべてのコンテンツは、常に1つのウィンドウに表示されます。私の現在のソリューションで は、私はページの新しいインスタンスにそれがスイッチするたびにインスタンス化問題を抱えている(たとえば、Aのための - > B - > A 2X新しいページA()は、結果として持っているそのターンの結果について

これを。私は本当に好きではありません。

を静的メソッドやクラスの多くを使用することで、私の現在のアプリケーションのナビゲーション構造の全体のオーバーホールを必要としない。このため、より良い解決策はありますか?

私の現在に私は静的なObversableCollectionのリストを使用して動的に作成されるコントロールの数を覚えていますので、ページA(mainWindow)に戻るとすべてが同じままです。

ありがとうございます。

+1

「this.Content = nextPage;」が間違っている可能性があります。現在のページがスコープから外れてガベージコレクタによってクリアされることなく実行されるため、実際には同じページのインスタンスが複数存在することはありません。あなたが使用している解決策は、私にはかなりいいようです –

答えて

5

このような簡単な設定(3ページと固定ナビゲーション構造)でナビゲーションを使用する理由はわかりません。もっと簡単な方法は、次のようになります。

  1. 使用メインウィンドウコンテンツプレースホルダーとして
  2. が別個のプロパティ内のページを保持するために、静的なクラスを定義するページなどのユーザーコントロールを作成します。必要に応じて初期化します(シングルインスタンス)。
  3. MainWindow.SetPage(Pages.First)を使用してページを変更します。コードで

、これはかなりのようになります。あなたが本当にナビゲーションが必要な場合、あなたはそれだけの静的な部分を使用し、SwitchPage方法にsingletonedのインスタンスを渡すことができますが

public class MainWindow : Window 
{ 
    // ... 
    public void SetPage(UserControl page) 
    { 
     this.Content = page; 
    } 
} 

// ... 

public static class Pages 
{ 
    private FirstUserControl _first; 
    private SecondUserControl _second; 
    private ThirdUserControl _third; 
    private MainWindow _window = Application.Current.MainWindow; 

    public UserControl First 
    { 
     get 
     { 
      if (_first == null) 
       _first = new FirstUserControl(); 
      return _first; 
     } 
    } 
    // ... 
} 

// Somewhere in B (after A -> B) 

    MainWindow.SetPage(Pages.First); 

+0

Tyさんは返事のために、私はそれを変更しても構いませんか? 小さい方のために、より意味のあるidd: – Rakr

+0

です。両方の方法の長所と短所を比較検討する必要があります。 –

+0

あなたは 'A'と' B'で何を参照していますか? –

1
public partial class MainWindow : Window 
{ 

    string un; 
    string pw; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 

     un = txtName.Text; 
     pw = txtPw.Text; 

     if (un.Equals("steve") && pw.Equals ("cool")) 
     { 
      Home h= new Home(); 
      this.Content = h.Content; ***// this is where we change the window's contents*** 


     } 
    } 
} 
関連する問題