2014年5月29日木曜日

wpf : ListBoxの選択項目がクリックで変更されたことを検出する

ListBoxやListViewの選択項目がクリックで変更されたときに実行したい処理があったので、検出のしかたを調べてみました。 ヒントになったのはこんな情報。

参考ページにはListViewの選択済みの項目がクリックされたのを検出する方法が書いてありますね。 ListViewItemのPreviewMouseLeftButtonDownイベントで検出しています。 Previewイベントという事でListViewの選択項目が反映される前のListViewItemの状態を見る事ができます。 そこでIsSelectedを見れば、まだ選択されていないものがクリックされてこれから選択が変更されるところなのか、選択済みのものがクリックされたのかが分かるという仕組みです。

ListViewでもListBoxでもだいたい同じです。 そして、IsSelectedを見て分岐するところを参考ページと逆にすれば目的が達成できそうですね。

2014年5月27日火曜日

大人の息抜きに木製輪ゴム銃?

gooニュースを読んでたらこんな記事がありました。

紙飛行機にもなる便箋とか、息抜き用の小物の記事ですね。 こういうのにちょっとした無駄遣いができる人がうらやましいです。

下の方に「ワルサーP38」っていうのもあります。 でも画像がない。 「なんで用意しないかな? こっちの方が絵ヅラとして重要なんじゃない?」 などと考えつつ検索してみました。

wpf : KeyGestureを継承したクラスでCtrlキーの左右を判別できるように、ついでに修飾キーなしでも動くように

今、適当に自分で使うツールを作っています。 作っているツールはキーボードショートカットで色々できるようにするつもりです。 で、[Ctrl+1]とかのショートカットは普通にwpf標準のコードでできるんですが、Ctrlキーの左右は指定できないんですよね。 でも左右で別の処理をさせたい。 「ローカルキーフックとかしないとダメなのかなぁ? なんとかならないかなぁ?」と検索してたら、KeyGestureを継承したクラスでできることがわかりました。 あんまり動作確認はしてないけど、次のようなコードでShiftキーとCtrlキーについては左右の判別ができそうです。 (一応コードにはできそうなそぶりで書いてあるけど、AltキーとWinキーは正常に動きませんでした。)

2014年5月22日木曜日

wpf : ListViewItemのDataTemplateで作った子コントロールを探す

検索してもそのものズバリが出てこなかったので一応書いてみました。 特定の行のListViewItemを探すには次のコードを使います。

でもこれだけじゃダメです。 ListViewはデフォルトでVirtualizingStackPanelを使っています。 VirtualizingStackPanel上では画面に必要なListViewItemしか作られません。 そのおかげで大量に行を登録しても軽快に動くのですが、当然作られていないListViewItemにはアクセスできません。 ContainerFromIndexを呼んでもnullが返ってきます。

2014年5月18日日曜日

3D落書き : 巨人

DAZ Studioで適当に絵を描いてbokete.jpにお題として投稿してみました。 興味がある方はどうぞ。

適当に縮尺を変えた人物を2つ配置しただけです。 背景と床のテクスチャはフリー素材を使いました。

2014年5月16日金曜日

wpf : Bindingで更新していたプロパティに即値を入れるとBindingが解除された

基本的なことかもしれませんが、最近初めて気付きました。 例えば、あるBorderの高さのBindingを解除する場合、普通はこうします。

DependencyProperty prop = Border.HeightProperty;
if (BindingOperations.IsDataBound(border, prop))
    BindingOperations.ClearBinding(border, prop);

その代わりにこうしてもいいようです。

border.Height = border.ActualHeight;

まぁ「解除できる」というか、解除されてしまったせいでバグになってつまづいたんですけどね。 すぐに理由が分かってよかった。

2014年5月14日水曜日

wpf : Bindingソースのパスをリファクターできるようにするためのコード

xamlではなく、C#のコードでのお話です。 以前の投稿でINotifyPropertyChangedでの通知対象のプロパティ名をリファクターできるようにするためのコードを書きました。 今回はそれを元に、Bindingするときのプロパティ名をリファクターできるようにしました。

考えるキッカケになったのはこんなコード。

2014年5月11日日曜日

wpf : INotifyPropertyChangedでプロパティ名をリファクターできるようにするためのコード

こういうふうにするんだそうです。

参考ページはこちら。

日本語の方のページには「式木とか実はよくわからない」って書いてますね。 私もです。 MSDNの方をよく読んだら解説っぽいことが書いてあるので、興味と根性がある人は読んでみてはどうでしょうか?

実行速度が必要な処理には使わない方が良さそうですが、どうなんでしょう? まぁそういうのにはINotifyPropertyChanged自体使わないんでしょうけど。

2014年5月10日土曜日

3D落書き : 落とし穴

DAZ Studioで適当に絵を描いてbokete.jpにお題として投稿してみました。 興味がある方はどうぞ。

DAZ Studioのライティングってよく分からないですね。 なんか影が思ったよりクッキリになってしまいました。 面光源とか使えばよかったんでしょうか?

2014年5月7日水曜日

wpf : ListViewの余白部分をクリックしたときにポップアップメニューを出す

ListViewの余白部分を右クリックしたときにポップアップメニューを出す場合、ListViewのContextMenuは使えません。 余白だけでなく、ListViewItemなどをクリックしたときにもポップアップメニューが出てしまうためです。 そのとき、ListViewItemに載せたコントロールにContextMenuを付けてもListViewのContextMenuが優先されて、ListViewItemのメニューは表示されません。 ListViewItemのContextMenuOpeningイベントで

とかすればListViewItemをクリックしたときポップアップメニューが表示されないようにはできますが、当然そうするとListViewItemのContextMenuは使えません。

解決策はうまく検索すれば見つかりそうですが、見つからなかったので自分でやり方を試行錯誤しました。 で、見つかったのがこれ。 結局単純なやり方で済ませました。

2014年5月6日火曜日

3D落書き : いないいないばぁ

DAZ Studioで適当に絵を描いてbokete.jpにお題として投稿してみました。 興味がある方はどうぞ。

いないいないばぁです。 英語ではPeek-a-booというらしいですね。 日本では「いないいない」で顔を隠して「ばぁ」で顔を出しますが、英語だと何も言わずに顔を隠して「Peek-a-boo」で顔を出すんだそうです。

2014年5月5日月曜日

PS3のサッカーゲームの体験版2つをプレイ

私はPS3の体験版をたまにチェックしていて、無駄に色々ダウンロードしています。 で、ほとんどプレイせずにHDDの容量だけ食いつぶしてます。 「それだけだと無駄なのでちょっとずつやっていこう」と思い立って、ここ1週間でサッカーゲーム2つの体験版をやってみました。 その感想を書きます。 ちなみに、ゲームは色々やってるけどサッカーゲームは30分程度?×数回しかやったことが無いのでビギナーの感想です。 ゲームの難易度も一番易しいやつで試しました。

対象のゲームはこちら。

2014年5月3日土曜日

3D落書き : 飛び込むのに勇気が要るプール

BlenderとDAZ Studioで適当に絵を描いてbokete.jpにお題として投稿してみました。 興味がある方はどうぞ。

DAZ Studioで人体モデルを用意して、Blenderでその他を作りました。 Blenderの流体シミュレーションを試そうと思いついたネタです。 描いてからの後付ですが、シミュレーションの計算量が多いので水が少なくってよかった。

2014年5月2日金曜日

wpf : MediaElementでシークしたときの表示の更新

MediaElementで動画を再生するときのお話。 ポーズ中にシークすると、デフォルトのままだとシーク後の現在時刻が内部的に変化しても画面に反映されません。 画面を更新するには動画の再生をしなければならないんです。 でも、これじゃシークで好きなシーンを探せないですよね? 「どうすりゃいいんだ?」と検索したら、MediaElementでサムネイルを作る方法を書いたTipsのページにヒントがありました。 MediaElementのScrubbingEnabledプロパティをTrueにすればいいようです。 それだけ。

注意点としては、「 ScrubbingEnabled を true に設定すると、パフォーマンスが多少低下することがあります(メディアの再生を対話的に制御する場合など)」だそうです。