2011年5月12日木曜日

RibbonComboBoxのSelectionChangedイベント

とある案件で、Windows Ribbon for WPF を使ったユーザーインターフェイスでアプリケーションを構築することになったのですが、これまで WPF は触ったことがないうえに参考になるサイトや書籍が少なく、開発環境を整えるだけでも一苦労しました。

(この辺の苦労話の詳細は割愛します・・・)

WPFリボン プログラミング」とか「ハンズオン ラボ: WPF の活用 ~ WPF Ribbon コントロール ~」を参考にしました。

四苦八苦しながらなんとかアプリケーションの形ができてきたのですが、Ribbon コントロールの中のひとつで、気に入らない挙動をするものがあります。

『RibbonComboBox』クラスです!

こいつはいわゆるコンボボックスで、アイテムをドロップダウンしたリストの中から選択するユーザーインターフェイスを提供するものです。
選択状態を検知するために用意されているイベントとしては『SelectionChanged』があり、アイテムが変更された際に発生します。

しか~~~し!

この『SelectionChanged』が曲者で、イベントプロシージャ内の処理が完了するまでドロップダウンのリストが表示されたままになります。
イベント処理が完了する前にマウスカーソルがリストの枠外に移動してしまうと、強制的に選択がキャンセルされてしまいます。
なので、時間のかかる処理を行うときは、選択がキャンセルされてしまい、意図した動きになりません。

いろいろと試行錯誤した結果、『SelectionChanged』イベントは使わずに、『System.Windows.Forms.Timer』クラスで処理させるようにします。

具体的には、以下のような実装になります。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//Timerクラスのメンバ変数を用意
private System.Windows.Forms.Timer m_timer = null;

//コンストラクタ内で変数を初期化
m_timer = new System.Windows.Forms.Timer();
m_timer.Tick += new EventHandler(TimerProc);
m_timer.Interval = 1000;
m_timer.Enabled = false;


//処理を行う関数の定義
private void TimeProc(object sender, EventArgs e)
{
    //1回だけ処理するので先にTimerを無効化

    m_timer.Enabled = false;

    //時間のかかる処理をここで実行

}

//コンボボックスのアイテムのクリックイベントの定義
private void item_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    //Timerを有効化

    m_timer.Enabled = true;
}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
コンボボックスのアイテムには『RibbonGalleryItem』クラスを使っているので、『Click』イベントではなく、『PreviewMouseLeftButtonDown』イベントで実装してます。

以上

0 件のコメント:

コメントを投稿