You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向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));
}

关键修改点说明

  1. 路由事件注册:把typeof(EventHandler<RoutedPropertyChangedEventArgs<double>>)替换为typeof(RoutedPropertyChangedEventHandler<double>)——这是WPF内置的专门用于属性变化路由事件的委托,和RoutedPropertyChangedEventArgs<T>是配套的。
  2. 事件声明:事件类型同步改为RoutedPropertyChangedEventHandler<double>,确保和注册的委托类型一致。
  3. 事件触发:原代码的参数传递逻辑是对的,无需改动,只需要保证委托类型匹配即可。

原错误信息

System.InvalidCastException: 'Unable to cast object of type 'System.EventHandler1[System.Windows.RoutedPropertyChangedEventArgs1[System.Double]]' to type 'System.Windows.RoutedPropertyChangedEventHandler`1[System.Double]'.'

内容的提问来源于stack exchange,提问作者SYB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:45:34