###前提・実現したいこと
NumericUpDownをユーザーコントロールで作成しました。
UpDownBase をユーザーコントロールで作成し、それを継承してデータ型別のUpDownコントロールを作成しています。
テキスボックス1つと、ボタン2つでユーザーコントロールを作成しています。
###問題点
どうやらオーバーライドしてもValueのプロパティのget値がint型になってしまうようで、
UlongUpDownなどでは"int < ulong"はできないとエラーになってしまいます。
ByteUpDownなどではint型より範囲が狭いせいか、エラーになりません(それでもget値はbyteではなくintになってしまっているみたいです。)
C#
1//継承元のクラス 2public partial class UpDownBase : UserControl 3 { 4 public dynamic maxValue; 5 public dynamic minValue; 6 private dynamic temp; //不正な値が代入されたときのバックアップ 7 8 9 public static readonly DependencyProperty ValueProperty = 10 DependencyProperty.Register("Value", typeof(object), typeof(UpDownBase), new PropertyMetadata(0)); 11 public virtual dynamic Value { 12 get { return GetValue(ValueProperty); } 13 set { SetValue(ValueProperty, value); } 14 } 15 16 //MouseWheelイベント 17 private void textBox_value_MouseWheel(object sender, MouseWheelEventArgs e) 18 { 19 if (textBox_value.IsFocused == false) 20 return; 21 if (Value is string)//範囲外の値がtextboxに入力されるとstring型になる(みたいな)のでエラー回避 22 Value = temp; 23 if (e.Delta > 0 && Value < maxValue) 24 Value++; 25 if (e.Delta < 0 && Value > minValue) 26 Value--; 27 temp = Value; 28 } 29 30 //省略(ButtonClickや、textBoxのLostFocusなどのイベントも、大体上のMouseWheelイベントと同じ) 31 }
C#
1//派生させたクラス 2 3public class ULongUpDown : UpDownBase //エラーになります 4{ 5 public ULongUpDown() 6 { 7 maxValue = (ulong)ulong.MaxValue; 8 minValue = (ulong)ulong.MinValue; 9 } 10 11 public new ulong Value { 12 get { return (ulong)(GetValue(ValueProperty)); } 13 set { SetValue(ValueProperty, value); } 14 } 15} 16 17public class ByteUpDown : UpDownBase //これはエラーになりません 18{ 19 public ByteUpDown () 20 { 21 maxValue = (byte)byte.MaxValue; 22 minValue = (byte)byte.MinValue; 23 } 24 25 public new byteValue { 26 get { return (byte)(GetValue(ValueProperty)); } 27 set { SetValue(ValueProperty, value); } 28 } 29}
ご教授のほどよろしくお願いいたします。
###追記
どうやらValueProperty
のnew PropertyMetadata(0)
の0
がintだったのが直接的な原因だったようです。
しかし、ではそこをオーバーライドしようとするとこれまたエラーが出ます…
C#
1//派生させたクラス 2 3public class ULongUpDown : UpDownBase //エラーになります 4{ 5 public ULongUpDown() 6 { 7 maxValue = (ulong)ulong.MaxValue; 8 minValue = (ulong)ulong.MinValue; 9 } 10 11 public static readonly new DependencyProperty ValueProperty = 12 DependencyProperty.Register("Value", typeof(object), typeof(UpDownBase), new PropertyMetadata((ulong)0)); 13 public new ulong Value { 14 get { return (ulong)(GetValue(ValueProperty)); } 15 set { SetValue(ValueProperty, value); } 16 } 17} 18
エラーの内容
'ULongUpDown' のタイプ初期化子が例外をスローしました。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/12/20 09:25
2016/12/20 09:51
退会済みユーザー
2016/12/20 15:29