スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: スポンサー広告

TextBoxのLostFocusイベントが肝心な時に発生しない。

 WPFで画面を開発していた時の話。
 マスタデータ等をメンテナンスするような画面では、画面終了時に、内容を変更していた時に限って終了を確認する為のメッセージを出す事がある。これは変更途中で間違って「x」ボタンを押してしまい、全部おじゃんにならなくて済むようにする為の保険になったりする。
 そんな感じで動く画面を作り、他の人にテストしてもらった時、NGがついてしまった。チェックした人が言うには、データを変更して画面を終了しようとしても、メッセージも出ずそのまま終了してしまうとの事だった。
 その画面では、TextBoxのTextプロパティとViewModel側のプロパティとは、下のような感じでデータバインディングしている。
<TextBox Text="{Binding InputText, UpdateSourceTrigger=LostFocus}"/>
TextBoxからフォーカスが外れた時点で、バインディングソースに変更通知が伝播するようにしていた。しかし、どうもLostFocusイベントが発生しないようだった。
しっかり再現もした。

(1)TextBoxにフォーカスしてカーソルが出ている状態にする。
(2)任意の文字を入力し、そのままマウスで右上の「x」ボタンを押す。
(3)そのまま終わってしまう。

WPFの仕様なのか、画面終了イベント(Closing)の後にLostFocusイベントが発生しているようだった。逆じゃねーかと半ギレしてみても、事態は何も変わらない。一番手っ取り早いのは、UpdateSourceTriggerをPropertyChangedに変更することだ。
<TextBox Text="{Binding InputText, UpdateSourceTrigger=PropertyChanged}"/>
うん。これで良い筈なんだけど…。これはこれでイベント通知が激しすぎるのが気になるんだ。何を入力しても即座に反応するので、更新通知頻度がとても高い。そのうえ、TextBoxからフォーカスが外れた時にのみチェックすれば良い事項があった時は、そもそもPropertyChangedにできない。結局、困った時のCommandさんに頼るのであった。続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

ファイルに保存したいのです。

 内部で処理をした後で、ファイルに保存させるとき、大抵はユーザーさんに保存先のフォルダとファイル名を入力(或いは選択)してもらう。Windows Forms同様、WPFにもこの保存用ダイアログというものが用意されている。
 ただし、このダイアログの実装で困ったのが、「ViewModel内でnewしてShowDialogしても良いのか?」という事だ。
var dialog = new Microsoft.Win32.SaveFileDialog();
dialog.ShowDialog();
あれ?これって画面だよな。てことは、インスタンスの生成や呼び出しは、「View」側にいるべきじゃね?そもそも、ShowDialogの第1引数に親ウィンドウ設定しないと、きっと碌なことにはならないし。
 でも、保存する為に選択したフォルダやらファイル名をViewModel側で受け取れないと、処理を続けられない。どうつなげばいいものか。で、悩んだ末に仕事において出した結論は、

Commandにすれば良いじゃない

だった。
「Commandである=ICommandインターフェイスを実装している」なんだから、コントロールにICommandを実装してバインディングさせてみよう!という事に至った。悪用ではない。多分。
続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

Pathのマークアップ構文

WPF 2Dグラフィック系のコントロールであるPathには独特のマークアップ構文がある。
<Window x:Class="TawamureDays.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DrawingPath" Height="300" Width="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Path Grid.Column="0" Stroke="Black" StrokeThickness="2"
Data="M 0,0 L 0,100 L 100,100 Z">
</Path>
<Path Grid.Column="1" Stroke="Black" StrokeThickness="2">
<Path.Data>
<PathGeometry>
<PathFigure IsClosed="True" StartPoint="0,0">
<LineSegment Point="0,100"/>
<LineSegment Point="100,100"/>
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
</Grid>
</Window>
二つの結果(描かれる図形)は同じになる。MとかLもマークアップ構文に含まれる。
パス マークアップ構文
どーしても標準にない形を書こうと思うなら、必要になる(例えば、バルーンチップに使われる吹き出し的な形)かもしれないので、メモっておく。
その気になれば複雑な図形も書けるので、この当たりをつきつめると、グラフが書けたりする。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

見た目だけそれっぽい。

後輩が、とある画面で、DataGridの列にハイパーリンクを表示しようとしたらしい。

後輩:ちょっと良いっすか?
自分:ん?なに?
後輩:DataGridHyperlinkColumnを使おうとしてるんっすけど、どうにも動かないんすよ。
自分:どれどれ?
後輩:ほら。押しても反応ないっす。
自分:ほんとだ。

(注)実際は、こんなにチャラい訳ではありません。
見た目は、きっちりとハイパーリンクな感じに見えるんだけど、それだけ。まさに押した時のカスカス感がなんだか物悲しい。で、どうなってるんだと、この標準装備であるところのDataGridHyperlinkColumnを調べる事になった。
DataGridHyperlinkColumn クラス
この中のメモ欄にこう書かれてあった。

Hyperlink による移動が行われるのは、Hyperlink の直接または間接的な親がナビゲーション ホストである場合だけです。 ナビゲーション ホストの例には、NavigationWindow、Frame、または Microsoft Internet Explorer 6 以降および Firefox 2.0 以降など、XBAP をホストできるブラウザーが含まれます。

ナビゲーションホスト?
ナビゲーションホスト
引用:

ナビゲーション ホストは、コンテンツにナビゲートして表示することができるクラスです。

日本語って、横文字率が増えると訳わからなくなるな…。まあ、ブラウザの様に、「進む」や「戻る」でページ遷移し、さらに履歴を保持できるようなクラス上でなければ、動かないという事らしい。うーん。でもそれって、普通のWindow上では見た目だけって事になってしまう。TemplateColumnで作るって手もあるけど、一々同じテンプレートを設定するか、そのテンプレートを持ち運ぶ事になってしまう。
で、仕事では、DataGridHyperlinkColumnを拡張することにした。
続きを読む
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

赤黒木かぁ。

 グラフ或いはチャートで書いた、WPF Toolkitのグラフコントロールを引き続き調査している。
 仕事でほしいグラフ(Series)は、散布図(Scatter)の点を線で結んだ多角形のような、いわゆる「ポリゴングラフ」。でも、当のライブラリに該当するクラスがない。なので、ソースコードをちまちま見ながら、どうやったら実装できるかを検証している。その中で、作られていたクラスに、「赤黒木」を内部で使ったMultiDictionaryがあった。
通常のDictionaryは、一つのキーに一つの要素しかもてない。MultiDictionaryは、一つのキーに複数の要素を持てるようにしたものらしい(自分は、要素をリストで持つようにして実現している)。
 このMultiDictionaryは、挿入、削除、検索なんかをもっと高速にできるようにする為のクラスなんだろう。
で、「赤黒木」ってなんだろ?と思い調べてみた。
赤黒木 (red-black tree)
left-leaning red-black tree
Left-Leaning Red-Black Tree by Java
二分木っぽいけど、似て非なるものかな。というか、こういうアルゴリズムがあると知らなかったので、書いている。
まずはこいつの理解から始めるか。
当サイトは基本をすっ飛ばしてます。基本文法等は、@ITをどうぞ
カテゴリー: WPF4 | コメント: 0 | トラックバック: 0

サイドバー背後固定表示サンプル

当ブログに書かれたソースコードは流用自由です。

バグ、スペルミス等はありうる事です。

ご利用の際は自己責任でお願いしますm(_ _)m

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