スポンサーサイト

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

WPFのListBoxをチルトホイールで横スクロールする

  • 2016/02/03 22:35
  • Category: WPF
WPFのListBoxは、マウスのチルトホイールを左右に傾けても横方向にスクロールしてくれません。
MouseWheel、PreviewMouseWheelイベントも回転にしか対応していないようで…


仕方ないので、まずはWndProcをフックして横スクロールイベントを検知します。
http://stackoverflow.com/questions/4158101/how-to-horizontally-scroll-in-wpf-using-mouse-tilt-wheel
チルトホイールを傾けたときのメッセージはWM_MOUSEHWHEEL(0x020E)、wParamの上位16ビット(wParam.ToInt32() >> 16)がスクロールした方向です。
左に倒すと-120、右に倒すと120になります。


次にListBoxをスクロールするために、ListBoxの子要素のScrollViewerを操作します。
ScrollViewer.LineLeftScrollViewer.LineRightで左右にスクロールできます。
傾け続けた場合の挙動は、スクロールバーの端にあるボタンを長押ししたときと同じ(?)ようです。


コード全体は以下のようになりました。前回と同じくBehaviorです。
カーソルがListbox内にあるときだけスクロールするように、MouseEnter、MouseLeaveでフラグ管理して制御してます。
53行目のVisualTreeHelpers.FindVisualChildはググればすぐに出てくる…と思います。



スポンサーサイト

WPFで数字のみ入力可能なTextBox

  • 2016/01/22 01:29
  • Category: WPF
数字のみ入力できるTextBox用ビヘイビアを作ってみました。





半角数字以外の文字入力を禁止するため、以下のような処理をしています。


1.数字以外の半角文字
PreviewTextInputイベントで正規表現にマッチしなければ拒否しています。
ただし半角スペースを入力したときにはPreviewTextInputが発生しないので、代わりにPreviewKeyDownで検知してます。
wpf - Why does PreviewTextInput not handle spaces? - Stack Overflow


2.全角文字
InputMethod.SetIsInputMethodSuspendedでtrueを指定してIMEを無効化すればいいようです。


3.貼り付け
DataObject.AddPastingHandlerで貼り付け時(Pastingイベント)のイベントハンドラを登録、数字以外の文字が含まれているときにキャンセルしています。


4.再変換
https://social.msdn.microsoft.com/Forums/ja-JP/27e12b0d-8ba9-4db6-8b10-28807668af77/textbox?forum=wpfja
>WPFのTextBoxだと、入力済み文字列を選択してスペースを押す事で再変換等もされます。
上でSetIsInputMethodSuspendedを使ってIMEをOFFにしているのでスペースを押したときの再変換はされませんが、TextBoxのコンテキストメニューには再変換候補がしっかり表示されてしまうため.xamlの方でTextBox.ContextMenuを書き換えて対処しています。


普通に使う分にはこれで問題ない・・・と思います。
といってもキーボード以外のデバイス(手書き入力、音声入力、タッチキーボードなど)を使えば数字以外を入力できてしまいます。
一応対処しようとしたのですが、検証中に謎の例外やエラーでクラッシュすることが多々あり、正直諦めました。
(InputMethod.SetIsInputMethodSuspendedでtrueを設定して手書き入力すると落ちる?)


補足
Extended WPF ToolkitのIntegerUpDownはアルファベットも全角文字も入力できますが、フォーカスが外れたときに内容をチェックして、数字以外の文字が含まれていると入力前の値に巻き戻すといった動作をするらしく。
TextBoxでもTextChangedで同様の処理をすれば、手書き入力等に対応できるかもしれません。

WPF ウィンドウをEscキーで閉じる

  • 2014/07/15 01:00
  • Category: WPF
Escキーを押したときにウィンドウが閉じるサンプル。
Expression Blend SDK の Behavior を使ってます。



WPFのWebBrowserでページを取得できたかを判断できない問題

  • 2014/03/11 22:53
  • Category: WPF
WPFのWebBrowser(System.Windows.Controls.WebBrowser)にはNavigated,LoadCompletedイベントがありますが、引数のNavigationEventArgsが持つプロパティは尽くnullを示すのでアクセスの成功/失敗が分かりません。というかそもそも失敗を示すイベント自体持ってません。
http://social.msdn.microsoft.com/Forums/vstudio/en-US/856608db-48ba-4492-bff1-3721618ff3ae/webbrowsercontrol-navigated-event?forum=wpf

なのでWebBrowserの代わりに Frame を使いましょう。
これの内部では NavigationService が使われてます。

FrameでもWebBrowserと同様にNavigateメソッドを使用しますが、引数はUriです。
stringを指定してもFrame内に文字列がそのまま表示されるだけです。

Navigateが成功すればLoadCompleted、失敗すればNavigationFailedが発生します。
中止やキャンセルなど他にもイベントはあるようですが割愛。

.xaml


.cs


ちなみにナビゲーションバーを非表示にするには
NavigationUIVisibility="Hidden"
でOK。

Pagination

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