2012年3月23日金曜日

wpf : TabControlのタブの左右にパネルを配置

タブを扱うアプリケーションで、タブの左右にコントロールを置きたいケースは多々あります。 例えば、タブの操作をするボタンを付けたり、省スペースのためタブの右側にツールバーを置いたりです。

実際にそういうレイアウトのアプリケーションは多くありますが、wpfのデフォルトのTabControlではそういうふうにはできません。 ですがstyleを書けば簡単に実現可能です。 というわけで試しに作ってみました。 こんな見た目になります。

MainWindow全体にstyle設定をしたTabControlを載せています。 そしてデフォルトではタブしか表示されない場所にボタン1~4を追加してみました。 タブの左右にパネルを追加できるように改造し、左側にはDockPanelとボタン1を、右側にはStackPanelとボタン2~4を追加しています。

2012年3月19日月曜日

wpf : ListBox.ItemsPanelにWrapPanelを設定して幅を調整

ListBoxのItemsPanelにテンプレートを設定すれば、項目のレイアウトを大きく変えることができます。 ItemsPanelにはPanel系のコンテナを指定することが可能です。 当然、WrapPanelも使えます。

本来、WrapPanelは子コントロールを左から右へ順に配置し、ボックスの端で折り返します。 (javaでいうところのFlowLayoutですね。) しかし、ListBox.ItemsPanelにWrapPanelを使うとちょっと表示がおかしくなってしまいます。 スクロールバーが表示されて折り返しが効かなくなるのです。

2012年3月18日日曜日

wpf : ContextMenuの項目クリックイベントからオーナーのコントロールItemを探す

次のような場合に、どのコントロールItemがクリックされてContextMenuが表示されたかを探す方法です。

  • TabControlやListBoxなどにItemsSourceを設定。
  • 各項目(TabItemやListBoxItemなど)のレイアウトはテンプレートで指定。
  • 各項目をクリックするとContextMenuが表示される。

ちなみに、TabControlの場合はアクティブなタブがクリックされたとは限らないし、ListBoxの場合は複数選択されているかもしれません。 よってTabControl.SelectedItemは使用不可。

とりあえずxamlのサンプルコードを載せます。 MainWindow.xamlです。

2012年3月17日土曜日

「うま味」はそのまま英語になっていた

以前投稿した英語のインターネットラジオをBGMにするやつ、今もたま~にやっています。 相変わらず何を言っているのか全く分かりません。 「ちょっとは聞ける様にならないかなぁ」と思っていなかったといえば嘘になりますが、やっぱりと言うか当然と言うか、分からないものは分からないままですね。 まぁ、他に英語の勉強を全くやってないので当然ですが。

そんなこんなで、今日も聞いてたんですが、たまたま「寿司」をテーマに話していたらしく、その単語は聞き取れました。 そして「umami」なる単語も聞こえてきます。

え? 旨み?

そんな訳ないよなぁ。 なんの聞き間違いでしょう? あれ? そういえば、「旨み」を発見したのは日本人だって言うのは美味しんぼで読んだような...

半信半疑で検索したら、英和辞典にも英語版wikipediaにも「umami」が載っていました。

一般的な単語かどうかは分かりませんが、どうやら「うま味」はそのまま英語になっていたようですね。

2012年3月16日金曜日

java : JTableの列幅変更で最終列だけに調整を適用する

ユーザーがJTableの列をドラッグしてサイズ変更するときの振る舞いについて。 最終列だけに調整を適用するにはAutoResizeModeプロパティにAUTO_RESIZE_LAST_COLUMNを設定すればOK。 ただ、これだけではこちらの望んだ振る舞いにはなりませんでした。 JTableのサイズが変更された場合、全部の列が拡大縮小されてしまうんですよね。 なんでこんな仕様になっているのやら...

仕方がないのでJTableを継承してホントにAUTO_RESIZE_LAST_COLUMNになるコンポーネントを作成しました。 基本方針は、

  • TableHeader上にマウスカーソルがあるとき列幅が変更可。
  • それ以外の場合は列幅は固定。
  • テーブルの幅が縮められたときは列幅の自動調整だけでは吸収できず、テーブルがコンテナからはみ出してしまうことがあるけど、それは仕様。

列幅の固定は、TableColumnのMinWidthとMaxWidthを現在の幅にすることで実現です。 で、↑の様なコードだけだとTableHeaderからマウスが離れた瞬間に列幅が変更できなくなってしまいました。 ドラッグ中のマウスの扱いについても考えなくてはならないようですね。

2012年3月3日土曜日

wpf : テキスト編集可のComboBoxでポップアップのクリックを検出

wpfでテキスト編集可のComboBoxを使っていて次の2通りのタイミングで処理がしたくなりました。

  • ComboBoxについているTextBoxでエンターキーが押された。
  • ComboBoxについているポップアップメニューのクリックで項目が選択された。

エンターキーはKeyBindingで検出するとして、問題はポップアップメニューの方です。 最初はSelectionChangedイベントを使えばいいのかと思ってたんですが、このイベント、けっこう色んなタイミングで発行されるんですよね。 具体的には次のタイミングで発行されるのを確認しました。

  • TextBoxの内容がComboBoxItemの内容と一致。
  • TextBoxの内容とComboBoxItemの内容とが一致した状態からTextBoxが書き換えられる。
  • TextBoxにフォーカスをあわせ上下キーでComboBoxItemを選択。
  • ポップアップメニューでComboBoxItemを選択。

TextBoxの書き換えのときはスルーして、エンターキーとポップアップメニュークリックにだけ反応させたかったのですが、そのようなイベントは用意されていませんでした。 自分で実装です。

インスタント麺の替え玉にゆで焼きそば

以前に書いたとおり、インスタント麺の替え玉にゆで蕎麦をよく使っています。 ゆで蕎麦は日持ちしないので「そろそろインスタント麺が食べたいなぁ」と思ったときにスーパーで買います。

で、そんな気分だったのでスーパーの蕎麦コーナーをのぞいてみたら、ゆで蕎麦が売り切れてました。 普段は山になって置いてあるのに、珍しい。