如何向RoutedEventHandler传递参数?Slider路由事件实现报错
WPF Slider路由事件ValueChanged传递参数修复方案
你遇到的InvalidCastException是因为注册路由事件时用错了委托类型。WPF中处理带属性变化的路由事件,必须使用专门的RoutedPropertyChangedEventHandler<T>委托,而非普通的EventHandler<RoutedPropertyChangedEventArgs<T>>。
修正后的完整代码
// 注册路由事件:委托类型改为RoutedPropertyChangedEventHandler<double> public static readonly RoutedEvent ColorSlideEvent = EventManager.RegisterRoutedEvent( nameof(ColorSlide), RoutingStrategy.Bubble, typeof(RoutedPropertyChangedEventHandler<double>), typeof(ColorLightControl)); // 事件声明对应改为RoutedPropertyChangedEventHandler<double> public event RoutedPropertyChangedEventHandler<double> ColorSlide { add => AddHandler(ColorSlideEvent, value); remove => RemoveHandler(ColorSlideEvent, value); } private void SliderColor_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) { // 触发事件时,直接传递原事件的参数(或封装新的参数) RaiseEvent(new RoutedPropertyChangedEventArgs<double>(e.OldValue, e.NewValue, ColorSlideEvent)); }
关键修改点说明
- 路由事件注册:把
typeof(EventHandler<RoutedPropertyChangedEventArgs<double>>)替换为typeof(RoutedPropertyChangedEventHandler<double>)——这是WPF内置的专门用于属性变化路由事件的委托,和RoutedPropertyChangedEventArgs<T>是配套的。 - 事件声明:事件类型同步改为
RoutedPropertyChangedEventHandler<double>,确保和注册的委托类型一致。 - 事件触发:原代码的参数传递逻辑是对的,无需改动,只需要保证委托类型匹配即可。
原错误信息
System.InvalidCastException: 'Unable to cast object of type 'System.EventHandler
1[System.Windows.RoutedPropertyChangedEventArgs1[System.Double]]' to type 'System.Windows.RoutedPropertyChangedEventHandler`1[System.Double]'.'
内容的提问来源于stack exchange,提问作者SYB
相关产品推荐
相关产品推荐

