午後わてんのブログ

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

WPFにもNumericUpDownみたいなのをユーザーコントロールで、その8、ValueChangedイベント追加した

NumericUpDown1.2.1

ダウンロード先

github.com ControlLibraryCore20200620_1.2.1.zip


作成動作環境

動作に必要なのは.NET Core 3.1がインストール済みのWindowsで、.NET Frameworkだけでは動かないはず




改善点

  • XAMLバインドエラー解消した
  • ValueChangedイベント追加した


XAMLバインドエラー解消した

実害はなさそうだったけど直した

f:id:gogowaten:20210306103325p:plain
デバッグ中にエラー表示
デバッグ中のメインウィンドウの上部にエラー表示されていて

f:id:gogowaten:20210306103745p:plain
エラー詳細
なんでもXAMLでのBindingでのエラーで、Brush型を指定する場所でSolidColorBrushが指定されているからエラーってことらしい

f:id:gogowaten:20210306104223p:plain
XAMLでのエラーの場所

Polygon Points="1,0 2,2 0,2 1,0" Fill="{Binding ElementName=MyRootPanel, Path=MyButtonMarkColor, Mode=OneWay}"
Polygonの塗りつぶしFillの色指定のBindingでMyButtonMarkColorを指定している、これの型がSolidColorBrushなのが原因みたいなので

f:id:gogowaten:20210306104514p:plain
SolidColorBrushからBrushに変更
こう書き直したらエラーが出なくなった(430~438行目を420~428行目)

いいんだけど、SolidColorBrushはBrushクラスを継承している型だからBrush型のプロパティにSolidColorBrush型の値を指定してもいい気がするし、特に不具合なく動いていたんだよねえ、わからん
それでもこれでエラーが無くなってスッキリした!





ValueChangedイベント追加した

これが今回の本命、やっぱり値変更時に発生するイベントはあったほうが便利ってことで

gogowaten.hatenablog.com

このときの記事を元に追加した

f:id:gogowaten:20210306110003p:plain
public class MyValuechangedEventArgs : RoutedEventArgs
これは前回からコピペ

f:id:gogowaten:20210306125529p:plain
イベント関連
赤背景が追加したところ
この辺もコピペなんだけど微妙に違うんだよねえ、難しい



動作テストとコード

f:id:gogowaten:20210306122850g:plain
動作テストの様子

数値変更は▼か▲をクリックの他、数値の上でホイール回転で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日前

gogowaten.hatenablog.com

次回のNumericUpDownは
gogowaten.hatenablog.com

前回のNumericUpDownは8ヶ月前
プロパティの説明とか
gogowaten.hatenablog.com

ユーザーコントロール導入方法
gogowaten.hatenablog.com

NumericUpDownの最初

gogowaten.hatenablog.com