如何将ExecutedRoutedEventArgs转换为RoutedEventArgs?复用方法遇类型错误
这个问题我之前也碰到过,本质是WPF里不同事件的参数类型不兼容导致的——MenuItem的Click事件传递的是RoutedEventArgs,但你要复用的方法接收的是ExecutedRoutedEventArgs,这俩虽然同属路由事件参数体系,但不能直接隐式转换。给你几个实用的解决思路:
写一个适配器中转方法
这是最稳妥的方案,不用修改原有方法,只需要新增一个适配Click事件的方法,在内部调用你已有的方法:private void MenuItem_Click(object sender, RoutedEventArgs e) { // 如果你原方法不需要用到ExecutedRoutedEventArgs的特殊属性(比如Parameter) YourExistingMethod(sender, new ExecutedRoutedEventArgs(null, null)); // 如果需要传递参数,可以从MenuItem本身获取,比如: var menuItem = sender as MenuItem; var parameter = menuItem?.CommandParameter; YourExistingMethod(sender, new ExecutedRoutedEventArgs(null, parameter)); }然后在XAML里把MenuItem的Click事件绑定到这个中转方法即可。
改用Command属性替代Click事件
既然你的原有方法是为ExecutedRoutedEventArgs设计的,大概率是和WPF命令系统配套的。那不如直接让MenuItem使用Command属性,这样就能天然适配你的命令执行方法:<MenuItem Command="{Binding YourCommand}" CommandParameter="YourParameterValue"/>这种方式更符合WPF的MVVM设计思想,也避免了事件参数适配的麻烦。
修改原有方法的参数类型(谨慎使用)
如果你的原有方法实际上并没有用到ExecutedRoutedEventArgs的特有属性(比如Command、Parameter),只是参数声明写成了这个类型,那可以考虑把方法参数改成RoutedEventArgs:private void YourExistingMethod(object sender, RoutedEventArgs e) { // 原有逻辑保持不变(如果没用到ExecutedRoutedEventArgs的特殊成员) }但这个方案要注意:如果其他地方还在调用这个方法并传递
ExecutedRoutedEventArgs,那没问题(因为子类可以赋值给父类参数);但如果原有逻辑依赖了ExecutedRoutedEventArgs的特有成员,就不能这么改了。
内容的提问来源于stack exchange,提问作者elig
相关产品推荐
相关产品推荐

