WPFにもNumericUpDownみたいなのをユーザーコントロールで、その8、ValueChangedイベント追加した
NumericUpDown1.2.1
ダウンロード先
github.com
ControlLibraryCore20200620_1.2.1.zip
作成動作環境
- Windows 10 Home バージョン 2004
- Visual Studio Community 2019
- WPF
- C#
- .NET Core 3.1
動作に必要なのは.NET Core 3.1がインストール済みのWindowsで、.NET Frameworkだけでは動かないはず
改善点
- XAMLバインドエラー解消した
- ValueChangedイベント追加した
XAMLバインドエラー解消した
実害はなさそうだったけど直した
デバッグ中のメインウィンドウの上部にエラー表示されていて
なんでもXAMLでのBindingでのエラーで、Brush型を指定する場所でSolidColorBrushが指定されているからエラーってことらしい
Polygon Points="1,0 2,2 0,2 1,0" Fill="{Binding ElementName=MyRootPanel, Path=MyButtonMarkColor, Mode=OneWay}"
Polygonの塗りつぶしFillの色指定のBindingでMyButtonMarkColorを指定している、これの型がSolidColorBrushなのが原因みたいなので
こう書き直したらエラーが出なくなった(430~438行目を420~428行目)
いいんだけど、SolidColorBrushはBrushクラスを継承している型だからBrush型のプロパティにSolidColorBrush型の値を指定してもいい気がするし、特に不具合なく動いていたんだよねえ、わからん
それでもこれでエラーが無くなってスッキリした!
ValueChangedイベント追加した
これが今回の本命、やっぱり値変更時に発生するイベントはあったほうが便利ってことで
このときの記事を元に追加した
これは前回からコピペ
赤背景が追加したところ
この辺もコピペなんだけど微妙に違うんだよねえ、難しい
動作テストとコード
数値変更は▼か▲をクリックの他、数値の上でホイール回転でSmallChange、▼か▲の上でマウスホイール回転でLargeChange
NumericUpDownの値変更時イベント発生時に、Borderの背景色を変更するように書いた結果、期待通りの動き
動作テストのMainWindow.xaml
<Window x:Class="_20210306_NumericUpDownDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:nume="clr-namespace:ControlLibraryCore20200620;assembly=ControlLibraryCore20200620" xmlns:local="clr-namespace:_20210306_NumericUpDownDemo" mc:Ignorable="d" Title="MainWindow" Height="350" Width="420"> <Window.Resources> <Style TargetType="nume:NumericUpDown"> <Setter Property="MyMinValue" Value="0"/> <Setter Property="MyMaxValue" Value="255"/> <Setter Property="MySmallChange" Value="1"/> <Setter Property="MyLargeChange" Value="16"/> <Setter Property="Width" Value="150"/> <Setter Property="Margin" Value="10,5"/> <Setter Property="FontSize" Value="30"/> </Style> </Window.Resources> <Grid UseLayoutRounding="True"> <StackPanel Orientation="Horizontal"> <Border x:Name="MyBorder" Width="200" Height="200" Background="Black" Margin="10"/> <StackPanel VerticalAlignment="Center"> <nume:NumericUpDown Name="NumeR" MyValue="0" MyValueChanged="Nume_MyValueChanged" MyStringFormat="赤 = 000"/> <nume:NumericUpDown Name="NumeG" MyValue="0" MyValueChanged="Nume_MyValueChanged" MyStringFormat="緑 = 000"/> <nume:NumericUpDown Name="NumeB" MyValue="0" MyValueChanged="Nume_MyValueChanged" MyStringFormat="青 = 000"/> </StackPanel> </StackPanel> </Grid> </Window>
1つのBorderと3つのNumericUpDown
NumericUpDownのMyValueChangedイベントを使っている
動作テストのMainWindow.xaml.cs
using System.Windows; using System.Windows.Media; namespace _20210306_NumericUpDownDemo { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Nume_MyValueChanged(object sender, ControlLibraryCore20200620.MyValuechangedEventArgs e) { MyBorder.Background = new SolidColorBrush( Color.FromRgb((byte)NumeR.MyValue, (byte)NumeG.MyValue, (byte)NumeB.MyValue)); } } }
ValueChangedイベント発生時にBorderの背景色を変更
関連記事
次回のWPF記事は16日後
gogowaten.hatenablog.com
前回のWPF記事は2日前
次回のNumericUpDownは
gogowaten.hatenablog.com
前回のNumericUpDownは8ヶ月前
プロパティの説明とか
gogowaten.hatenablog.com
ユーザーコントロール導入方法
gogowaten.hatenablog.com
NumericUpDownの最初