午後わてんのブログ

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

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

f:id:gogowaten:20200712152214g:plain
フォントサイズによってサイズ変化

ControlLibraryCore20200620_v1.1.0.7z


Releases · gogowaten/userControl
https://github.com/gogowaten/userControl/releases
github.com

設定例
f:id:gogowaten:20200712172553p:plain

プロパティ名 既定値 説明
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
f:id:gogowaten:20200712173414p:plain
普通に依存関係プロパティを追加して

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

f:id:gogowaten:20200712174023p:plain
9行目で名前を付けておいたもの

BindingのソースにUserControlを指定するときに、前回は
f:id:gogowaten:20200712175501p:plain
RelativeSourceを使っていたけど、今回はUserControlに名前をつけたので

f:id:gogowaten:20200712175538p:plain
ElementNameを使って、こうなった。こっちのほうがラクなんだけど、これでいいのかはわからん

TextAlignmentはTextBoxの方なので、他のと一緒に
f:id:gogowaten:20200712193522p:plain
こうで、追加したところは

f:id:gogowaten:20200712193559p:plain
ソースはUserControlのNumericUpDownで、それぞれの同名のプロパティにBindingしている。最後のTextAlignmentだけはさっきの依存関係プロパティのMyTextAlignmentにBindingしているのは、UserControlにはTextAlignmentプロパティがなかったから
Modeは全部OneWayにしているけどTextAlignmentだけはTwoWayでもいいかも


前回はFontSizeとHeightを別々に指定して表示の調整をしていた
f:id:gogowaten:20200712195141p:plain
フォントが大きすぎるとこうなっていた

f:id:gogowaten:20200712195317p:plain
Heightを適当に合わせて調整、めんどくさい

前回のボタンの大きさと▲の形
f:id:gogowaten:20200712195328p:plain
どれだけNumericUpDownを大きくしても、ボタンの大きさ(幅)は変化なしだった

今回は
f:id:gogowaten:20200712195337p:plain
FontSizeの指定だけで適当な大きさになる
Control全体の大きさ(Height)もFontSizeに合わせて変化

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

コンバーター
f:id:gogowaten:20200712201302p:plain
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年前に作ったものよりいいのができて満足

関連記事
前回は5日前
.NET Core、WPF、ユーザーコントロールのDLLをアプリで使うまでの手順メモ - 午後わてんのブログ

gogowaten.hatenablog.com

はじまり
gogowaten.hatenablog.com