気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
現在、WPFで開発している仕訳入力用ソフト「Paella」は、以下の3つ画面を持つアプリケーションです。

・振替伝票入力
・振替伝票参照
・残高試算表

その中で、「振替伝票入力」と「振替伝票参照」は用途を考えると同時に参照したいページになると思います。
そこで、「Paella」では、ウィンドウ内に1つのTabControlを配置し、その中に各ページを置く通常モードと
ウィンドウ内に2つのTabControlを左右に並べて配置する分割モードをサポートするようにします。
以下が通常モードの画面イメージになります。

「通常モード画面」

この状態で、メニューの「並べて表示」をクリックすると、分割モードに切り替わります。

「分割モード画面」

分割前に選択されていたページを右側のTabControlに移動させて、並べて表示しています。
この動作を実現するために専用のユーザコントロール「TabHost」を作りました。

メインウィンドウのツリー構造は以下のようになっています。
(一部属性は省略)

  <Window>
    <DockPanel Name="_rootPanel">
        <Menu DockPanel.Dock="Top">
            (中身省略)
        </Menu>
        <ToolBar DockPanel.Dock="Top">
            (中身省略)
        </ToolBar>
        <local:TabHost x:Name="_tabHost"/>
    </DockPanel>
  <Window>

「TabHost」の中では、Grid内にTabControlを動的に配置しています。通常モードでは、Gridを1列1行にし、分割モードでは2列1行に
しています。

以下は通常モードの場合にTabControlを動的に追加する部分のコードです。画面に初めて表示された時点では通常モードで開くので
メインウィンドウのLoadedイベントのハンドラから下記メソッドをコールしています。

 public void OpenSingle()
 {
  解説:分割モードから通常モードに切り替える際にもコールされるメソッドなので、
  メソッドの先頭で行と列の定義をクリアする処理を行っています。

     //Gridを初期化する
     _tabPanel.Children.Clear();
     _tabPanel.ColumnDefinitions.Clear();
     _tabPanel.RowDefinitions.Clear();

  解説:一旦クリアした後、新たに1つずつ、行と列の定義を作って、Gridに設定します。

     //列を定義する
     ColumnDefinition col = new ColumnDefinition();
     _tabPanel.ColumnDefinitions.Add(col);

     //行を定義する
     RowDefinition row = new RowDefinition();
     _tabPanel.RowDefinitions.Add(row);

  解説:「_rightTab」は分割表示している際の右側のTabControlです。
  現在分割表示している場合を考慮し、右側のTabControlにあるページを一旦Listに退避し、
  左側のTabControlに移します。

     //右側のTabControlに追加されているTabItemを左側の
     //TabControlに移す
     List rightPages = new List();
     foreach (ExtendedTabItem page in _rightTab.Items)
     {
         rightPages.Add(page);
     }

     _rightTab.Items.Clear();

     foreach (ExtendedTabItem page in rightPages)
     {
         _leftTab.Items.Add(page);
     }

  解説:右側のTabControlを列と行を指定して、Gridに追加しています。

     //左側のTabControlをPabelに追加する
     _tabPanel.Children.Add(_leftTab);
     Grid.SetColumn(_leftTab, 0);
     Grid.SetRow(_leftTab, 0);

  解説:_isDividedは現在分割表示をしているかどうかを示すフラグ。ここではfalseに設定

     _isDivided = false;

  解説:IsDividableはTabHostが分割表示に出来る状態になっているかを示すフラグです。
  メインウィンドウの「並べて表示」と「並べて表示を解除」メニューを切り替えるために
  このフラグを使用します。現在分割表示されておらず、左側のTabControlにTabのページが
  2つ以上存在する場合、分割できる状態としています。

     //左側のTabに2つ以上のページが有る場合
     //分割可能フラグをたてる
     if (_leftTab.Items.Count >= 2)
     {
         IsDividable = true;
     }
     else
     {
         IsDividable = false;
     }
 }


次回も引き続きTabHostを解説します。

本日のソース





コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/28-0835297a

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。