none
WPFでWindowsFormのSuspendLayoutと同等の動作 RRS feed

回答

  • このページの以下の点にかかわってきます。
    http://msdn.microsoft.com/ja-jp/library/aa970683(VS.80).aspx

    ユーザー インターフェイスの仮想化
    データ連結
    ItemsSource へのバインディング
    IEnumerable ではなく IList を ItemsControl にバインドする

    DataGridならではの解決策もあります。

    データはどういうコレクションクラスを使っていますか?
    列数や件数はどのくらいでしょうか?
    DataGridに対するプロパティ設定はどうなっているでしょうか?
    DataGridの特殊な設定は使っていますでしょうか?


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    • 回答の候補に設定 山本春海 2010年10月28日 5:34
    • 回答としてマーク 山本春海 2010年11月1日 5:27
    2010年10月7日 11:34
  • 試してみました。

    このケースの場合、DataGridの右クリックで複数選択が解除されるでなかむらさんが回答されているように、

     

    試したところ、行を複数選択した状態で行ヘッダー上で右クリックすると、クリックした位置にある行が選択された後にコンテキストメニューが表示されるようですね。

    DataGrid の PreviewMouseRightButtonDown イベントをハンドルして、行ヘッダ上で右クリックしたときだけ自力でコンテキストメニューを表示する、というのはどうでしょうか。

    自力でコンテキストメニューを表示する際は、イベント引数の Handled プロパティを true に設定してやれば、右クリックで複数選択が解除される、という動作は回避できるかもしれません。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    PreviewMouseRightButtonDownイベントでコンテキストメニューのオープンなりの行いたい処理を実行後、e.Handed=true;にすることで、そもそも選択が解除される事自体を回避できました。

    WPFではUIのレンダリングスレッドと通常のUIスレッドは異なります。
    レンダリングの実行は即時とは限らず、現時点でレンダリングが即時反映される挙動も将来の実装では変わってくるかもしれません。

    レンダリングスレッドを停止する手段はないようですが、DispatcherPriorityを駆使する事でUIスレッドとレンダリングスレッドのタイミングをある程度制御することは可能です。
    DispatcherPriorityをうまく使えば、SuspendLayout/ResumeLayoutが必要になるケースはほとんどないと思います。

    例)DispatcherPriorityを使用して、レンダリングスレッドに同期をとる
    • 回答の候補に設定 山本春海 2010年10月28日 5:34
    • 回答としてマーク 山本春海 2010年11月1日 5:27
    2010年10月19日 9:14

すべての返信

  • 別の解決手段があるかもしれません。

    どういうコントロールに対してどういうデータ(入れ物のクラスとか件数とか)を使いたいのでしょうか?


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    2010年10月7日 8:35
  • DataGridの右クリックで複数選択が解除されるに関連するんですが

    コンテキストメニューのOpenedイベント時にDataGridの選択を解除して再選択時に

    画面がちらつくのでSuspendLayoutと同等の動作を行いたかったのです。

    2010年10月7日 8:47
  • このページの以下の点にかかわってきます。
    http://msdn.microsoft.com/ja-jp/library/aa970683(VS.80).aspx

    ユーザー インターフェイスの仮想化
    データ連結
    ItemsSource へのバインディング
    IEnumerable ではなく IList を ItemsControl にバインドする

    DataGridならではの解決策もあります。

    データはどういうコレクションクラスを使っていますか?
    列数や件数はどのくらいでしょうか?
    DataGridに対するプロパティ設定はどうなっているでしょうか?
    DataGridの特殊な設定は使っていますでしょうか?


    えムナウ@わんくま同盟 Microsoft MVP Visual Studio C# Since 2005/01-2010/12
    • 回答の候補に設定 山本春海 2010年10月28日 5:34
    • 回答としてマーク 山本春海 2010年11月1日 5:27
    2010年10月7日 11:34
  • 試してみました。

    このケースの場合、DataGridの右クリックで複数選択が解除されるでなかむらさんが回答されているように、

     

    試したところ、行を複数選択した状態で行ヘッダー上で右クリックすると、クリックした位置にある行が選択された後にコンテキストメニューが表示されるようですね。

    DataGrid の PreviewMouseRightButtonDown イベントをハンドルして、行ヘッダ上で右クリックしたときだけ自力でコンテキストメニューを表示する、というのはどうでしょうか。

    自力でコンテキストメニューを表示する際は、イベント引数の Handled プロパティを true に設定してやれば、右クリックで複数選択が解除される、という動作は回避できるかもしれません。

     


    なかむら(http://d.hatena.ne.jp/griefworker)
    PreviewMouseRightButtonDownイベントでコンテキストメニューのオープンなりの行いたい処理を実行後、e.Handed=true;にすることで、そもそも選択が解除される事自体を回避できました。

    WPFではUIのレンダリングスレッドと通常のUIスレッドは異なります。
    レンダリングの実行は即時とは限らず、現時点でレンダリングが即時反映される挙動も将来の実装では変わってくるかもしれません。

    レンダリングスレッドを停止する手段はないようですが、DispatcherPriorityを駆使する事でUIスレッドとレンダリングスレッドのタイミングをある程度制御することは可能です。
    DispatcherPriorityをうまく使えば、SuspendLayout/ResumeLayoutが必要になるケースはほとんどないと思います。

    例)DispatcherPriorityを使用して、レンダリングスレッドに同期をとる
    • 回答の候補に設定 山本春海 2010年10月28日 5:34
    • 回答としてマーク 山本春海 2010年11月1日 5:27
    2010年10月19日 9:14
  • こんにちは、tokagi3129 さん。

    フォーラム オペレーターの山本です。

    その後いかがでしょうか。
    えむナウ さんや、ugaya40 さんからの情報はご確認されましたでしょうか。

    えむナウ さんや、ugaya40 さん、情報ありがとうございます。お二人からの情報は有効な情報であると思われましたので、勝手ながら私のほうで一旦回答としてマークさせていただきました。
    同じ問題で今後このスレッドを参照される方に、有効な情報がわかりやすくなるかと思いますので、解決に役立った有効な情報や参考になる情報には、回答としてマークすることをお願いしています。

    もし現在も解決されていない、また tokagi3129 さんが問題とされている状況と異なるなどあるようでしたら、現在の状況や問題の詳細を投稿いただいて、ご質問を続けてくださいね。
    今後とも、MSDN フォーラムをよろしくお願いいたします。それでは。
                                                                                       
    マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2010年11月1日 5:26