午後わてんのブログ

ベランダ菜園とWindows用アプリ作成(WPFとC#)

WPFにもNumericUpDownみたいなのをユーザーコントロールで、その3

昨日の続き

f:id:gogowaten:20200622132533g:plain
ユーザーコントロールの依存関係プロパティとのBinding

  • decimal型の依存関係プロパティ(名前:MyValue)を追加
  • RepeatButtonクリックでMyValueに+1、-1

を追加した

github.com


UserControl1.xaml.cs
クラスの名前をUserControlからNumericUpDownに変更した
f:id:gogowaten:20200622134312p:plain
右クリックメニューの名前の変更から変更

f:id:gogowaten:20200622134520p:plain
これで動作確認用アプリのMainWindow.xamlに書いたUserControl1も、自動で書き換えられたはずだと、このときは思っていたんだけどそうじゃなかった

依存関係プロパティをコードスニペットを使って追加
f:id:gogowaten:20200622134737p:plain
propdpとタイプしてTabキーで

f:id:gogowaten:20200622134927p:plain
これだけ自動で入力される、この楽ちんな方法は最近知った
あとは必要なところを書き換えるだけで、それもTabキーを押していくと順番に選択される

型:decimal
名前:MyValue
ownerclass:NumericUpDown(自分)
PropertyMetadata(既定値の設定):0m(decimal型の0)

f:id:gogowaten:20200622135517p:plain
あとは必要ないけど、128行目のコメントは要らないのと、130行目の文字列で指定している"MyValue"が気になるのでnameof()で取るようにして

f:id:gogowaten:20200622140016p:plain
こうした
これでMyValueって名前の、decimal型で既定値0mの依存関係プロパティできたので、これをTextBoxのTextプロパティにBindingする

UserControl1.xaml
TextBoxのTextプロパティにMyValueをBinding
f:id:gogowaten:20200622140657p:plain
追加したのは43と44行目、これでいいんだけど44行目のAncestorTypeの指定は少し端折って

f:id:gogowaten:20200622141602p:plain
これでも動いた
TextプロパティにBindingするソースはNumericUpDownで、これはここに配置したTextBoxの親(祖先:Ancestor)に当たるので、 FindAncestorやAncestorTypeってのを使っているみたい
あと気になるのは、Textプロパティの型はStringなのに、decimal型のMyValueをBindingしているところ、本当ならコンバーターが要ると思うんだけど、なんかうまいこと処理してくれてるみたい
これでUserControlの方はできたのでビルドしてから、次は動作確認用アプリのほう


MainWindow.xaml
f:id:gogowaten:20200622142945p:plain
デザインが表示されていなくて、エラーを表す波線がついている(14と15行目)。ビルドしてくださいってあるのでビルドしたら

ビルド失敗
f:id:gogowaten:20200622143111p:plain
どうやらUserControl1の名前をNumericUpDownに変更したのが、こっちでは反映されていなくてエラーになっているみたい

f:id:gogowaten:20200622143337p:plain
確かに古い名前のままになていたので、NumericUpDownに書き直す

f:id:gogowaten:20200622143524p:plain
まだ表示されないのでビルド

f:id:gogowaten:20200622143627p:plain
ようやく表示された、既定値の0も表示されている

MyValueに値を指定
f:id:gogowaten:20200622143732p:plain
入力候補に出てくる

f:id:gogowaten:20200622143846p:plain
MyValueに5を指定したら、デザインの方でも表示が反映された

SliderのValueとBinding
f:id:gogowaten:20200622144059p:plain
NumericUpDownにnumeって名前つけて、これをSliderにBinding

デバッグ開始
f:id:gogowaten:20200622144352p:plain
f:id:gogowaten:20200622144430p:plain
期待通り連動している

RepeatButtonで値を変更できるようにする
UserControl.xamlに戻って
f:id:gogowaten:20200622145003p:plain
RepeatButtonのクリックイベントに新しいイベントハンドラーを追加、っていうのかな、ここまでタイプしてTabキー押すと

f:id:gogowaten:20200622144601p:plain
適当な名前が入るので、それにカーソルを合わせてF12キーを押せば、そのメソッドにジャンプする

f:id:gogowaten:20200622145325p:plain
138行目に飛んできた、楽ちん

f:id:gogowaten:20200622145801p:plain
MyValueに1足す

f:id:gogowaten:20200622145837p:plain
同じようにもう一つのRepeatButtonのクリックでは1引くようにして完成

必要ないけど
f:id:gogowaten:20200622145934p:plain
メソッド名変更

f:id:gogowaten:20200622150031p:plain
それぞれUpとDownと付けて変更完了、XAMLの方は?

f:id:gogowaten:20200622150346p:plain
連動して変更されていた、こんなふうに自動で変更されるから、UserControlのクラス名を変更したときも全部自動で書き換わるのかと期待していたんだよねえ、別プロジェクトだと書き換わらないとかかなあ
これでできたのでビルドしてからデバッグ開始

f:id:gogowaten:20200622151059p:plain
クリックで1ずつ変更できるようになってNumericUpDownっぽくなった
今回はここまでで、あと残っているのが変更値の設定、下限上限の設定が必須で、数値の書式設定

f:id:gogowaten:20200622160733p:plain
ファイル名のUserControl1ってのもNumericUpDownに変更したい
f:id:gogowaten:20200622161050p:plain
f:id:gogowaten:20200622161103p:plain




関連記事
次回は明日
gogowaten.hatenablog.com

前回は昨日
gogowaten.hatenablog.com