none
ContentControlでユーザコントロールを切り替える際に、以前表示させていたコントロールを消す方法 RRS feed

  • 質問

  • ご存知の方がいれば教えてください。

    メインWindowに、ContentControlを配置し、

    そのContentContolで、ユーザコントロールを切り替えて表示させるようなアプリを作成しております。

    下記のように、パラメータによって、ContentControlの値を変えるつもりです。

    現在、気になっているのが、

    もともと、ユーザコントロールBを表示していたとして、次にAを表示する場合、

    ユーザコントロールBが不要なので、メモリからすぐに消したいのですが、

    この方法がよくわかりません。

    (Form系だと、インスタンス.Close()で可能だったかと思います。)

    ContentControlに違うインスタンスを割り当てた際に、

    一定時間経過後、自動的にメモリからクリアされるので、

    それほど神経質になる必要はないのでしょうか?

      switch (UserControlName)
      {
        case "A":
          ContentControlMain.Content = new UserControlA();
          break;
        case "B":
          ContentControlMain.Content = new UserControlB();
          break;
        case "C":
          ContentControlMain.Content = new UserControlC();
          break;
      }




    • 編集済み sasagaki 2013年11月13日 10:45
    2013年11月13日 10:44

回答

  • コントロール内にアンマネージドなリソースはあるのでしょうか?

    ある場合、IDisposableインターフェースのDisposeメソッドを実装し、
    その中で明示的に開放してあげるのが良いと思います。

    マネージドコードだけの場合、気にしたことはありません。


    rysa


    • 編集済み rysaproject 2013年11月13日 14:51
    • 回答としてマーク sasagaki 2013年11月14日 1:27
    2013年11月13日 14:50
  • データバインドは使用していないのでしょうか? WPF / XAMLではデータに応じてUI(Control)を切り替える仕組みが用意されているので、質問に挙げられているようなswitch文を書く必要はないのですが。
    • 回答としてマーク sasagaki 2013年11月14日 1:36
    2013年11月14日 0:22
  • ContentControlに違うインスタンスを割り当てた際に、

    一定時間経過後、自動的にメモリからクリアされるので、

    それほど神経質になる必要はないのでしょうか?

    基本的にはそれで大丈夫だと思いますが、ユーザーコントロールのインスタンスが他のオブジェクトのイベントを購読して、そのオブジェクトの寿命のがユーザーコントロールのインスタンスの寿命より長い場合、そのオブジェクトがユーザーコントロールのインスタンスを参照し続けますので、いつまで経ってもユーザーコントロールのインスタンスがメモリから消えないということが起こります。これは今回ご質問のユーザーコントロールに限らず、一般的な話ですので注意する必要があります。この問題を解決するには、「弱いイベントパターン」が一般的に使用されますので、調べてみて下さい。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク sasagaki 2013年11月14日 1:36
    2013年11月14日 0:36
    モデレータ

すべての返信

  • コントロール内にアンマネージドなリソースはあるのでしょうか?

    ある場合、IDisposableインターフェースのDisposeメソッドを実装し、
    その中で明示的に開放してあげるのが良いと思います。

    マネージドコードだけの場合、気にしたことはありません。


    rysa


    • 編集済み rysaproject 2013年11月13日 14:51
    • 回答としてマーク sasagaki 2013年11月14日 1:27
    2013年11月13日 14:50
  • データバインドは使用していないのでしょうか? WPF / XAMLではデータに応じてUI(Control)を切り替える仕組みが用意されているので、質問に挙げられているようなswitch文を書く必要はないのですが。
    • 回答としてマーク sasagaki 2013年11月14日 1:36
    2013年11月14日 0:22
  • ContentControlに違うインスタンスを割り当てた際に、

    一定時間経過後、自動的にメモリからクリアされるので、

    それほど神経質になる必要はないのでしょうか?

    基本的にはそれで大丈夫だと思いますが、ユーザーコントロールのインスタンスが他のオブジェクトのイベントを購読して、そのオブジェクトの寿命のがユーザーコントロールのインスタンスの寿命より長い場合、そのオブジェクトがユーザーコントロールのインスタンスを参照し続けますので、いつまで経ってもユーザーコントロールのインスタンスがメモリから消えないということが起こります。これは今回ご質問のユーザーコントロールに限らず、一般的な話ですので注意する必要があります。この問題を解決するには、「弱いイベントパターン」が一般的に使用されますので、調べてみて下さい。

    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク sasagaki 2013年11月14日 1:36
    2013年11月14日 0:36
    モデレータ
  • ご回答ありがとうございます。

    実装しているのは、マネージドコードのみです。

    あまり気にしなくてもよいとのことで安心しました。

    2013年11月14日 1:27
  • ご回答ありがとうございます。

    最初は、ユーザーコントロール自体をデータバインドさせていて、

    プロパティ変更通知で画面を切り替えていたのですが、

    ユーザーコントロール側から、

    メインウインドウのユーザコントロールの切り替えが必要になり、

    コードビハインドにイベントとして登録させる方法にしました。

    2013年11月14日 1:34
  • ご回答ありがとうございます。

    弱いイベントパターンについて、勉強していきたいと思います。

    2013年11月14日 1:35