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

ControlLibraryCore20200620_v1.1.0.7z
Releases · gogowaten/userControl
https://github.com/gogowaten/userControl/releases
github.com
設定例

| プロパティ名 | 型 | 既定値 | 説明 |
|---|---|---|---|
| MyValue | decimal | 0m | 値 |
| MyText | String | "" | MyValueを書式に従ってToStringしたもの、表示用 |
| MyMinValue | decimal | decimal.MinValue | 最小値、下限 |
| MyMaxValue | decimal | decimal.MaxValue | 最大値、上限 |
| MySmallChange | decimal | 1m | 小変更値、ボタン押したときの変化値 |
| MyLargeChange | decimal | 10m | 大変更値、ボタンの上でホイール回したときの変化値 |
| MyStringFormat | String | "" | 書式、MyValue.ToString(書式)で使う |
| MyButtonMarkColor | ? | "DarkGray" | ボタンの▲マークの色 |
| MyTextAlignment | TextAlignment | Right | 表示位置、左寄せ、中央、右寄せ |
下の2つが今回追加したプロパティ
追加
- ボタンの▼と▲マークの色指定(MyButtonMarkColor)
- TextBoxの
- FontSize指定
- Foreground
- Background
- BorderBrush
- TextAlignment(MyTextAlignment)
変更
- ボタンの▲と▼マークの形
- ボタンのサイズ(Width)をコントロールの高さActualHeightに合わせるようにした
▲マークの色とTextAlignment

普通に依存関係プロパティを追加して

FillプロパティにMyButtonMarkColorをBinding、68行目
ElementNameで指定しているMyRootPanelはUserControlそのもので

9行目で名前を付けておいたもの
BindingのソースにUserControlを指定するときに、前回は

RelativeSourceを使っていたけど、今回はUserControlに名前をつけたので

ElementNameを使って、こうなった。こっちのほうがラクなんだけど、これでいいのかはわからん
TextAlignmentはTextBoxの方なので、他のと一緒に

こうで、追加したところは

ソースはUserControlのNumericUpDownで、それぞれの同名のプロパティにBindingしている。最後のTextAlignmentだけはさっきの依存関係プロパティのMyTextAlignmentにBindingしているのは、UserControlにはTextAlignmentプロパティがなかったから
Modeは全部OneWayにしているけどTextAlignmentだけはTwoWayでもいいかも
前回はFontSizeとHeightを別々に指定して表示の調整をしていた
フォントが大きすぎるとこうなっていた

Heightを適当に合わせて調整、めんどくさい
前回のボタンの大きさと▲の形

どれだけNumericUpDownを大きくしても、ボタンの大きさ(幅)は変化なしだった
今回は

FontSizeの指定だけで適当な大きさになる
Control全体の大きさ(Height)もFontSizeに合わせて変化
ボタンの大きさは

ボタン(RepeatButton)を配置するGridの区切りのColumnDefinitionのWidthプロパティに、UserControl自体のActualHeightをBindingして調整している、24~28行目
ActualHeightの数値をそのままWidthにすると大きすぎるので、適当な数値で割り算した結果を使いたいのでコンバーターを作成して使っている、14行目、28行目
コンバーター

467行目、ConvertBackを使っていないのは一方通行だからで、UserControlのActualHeight→ColumnDefinitionのWidthへの一方通行。
460行目、ConvertではActualHeightを1/3にして返している、462~464行目
1/3ってのは適当に決めたんだけど、その試しているときに1/2以上の1/1.9とかにしたら、無限ループでエラーになってめんどくさかった。で、1/2.1以上なら動いたからこれ(1/3)でいいわってことにしたんだけど、なにかの拍子に変な動きなるかも
今回のでNumericUpDownは完成
2年前に作ったものよりいいのができて満足
関連記事
次回は8ヶ月後
前回は5日前
.NET Core、WPF、ユーザーコントロールのDLLをアプリで使うまでの手順メモ - 午後わてんのブログ