wpf RibbonSplitButton命令执行两次

cvxl0en2  于 2023-05-13  发布在  其他
关注(0)|答案(5)|浏览(175)

我正在使用Ribbons控件库从微软的WPF提供一个功能区在我们的WPF应用程序。
我们在XAML部件中以以下方式使用Splitbuttons:

<r:RibbonSplitButton Label="SplitButtonLabel" LargeImageSource="..." Command="{Binding SplitButtonCommand}">
  <r:RibbonSplitMenuItem Header="Item 1" ImageSource="..." Command="{Binding Command1}"/>
  <r:RibbonSplitMenuItem Header="Item 2" ImageSource="..." Command="{Binding Command2}"/>
  <r:RibbonSplitMenuItem Header="Item 3" ImageSource="..." Command="{Binding Command3}"/>
</r:RibbonSplitButton>

如果我点击拆分按钮的上半部分,命令SplitButtonCommand会像正常情况下一样执行一次。
如果我点击SplitButton的底部,然后点击任何Menü项目(例如第1项)本项的命令执行两次。
有没有人知道问题的原因?

cnh2zyt3

cnh2zyt31#

看起来它可能是通过设计来看看这篇文章。有一个解决方案提到:
虽然这是RibbonControl的本质,但您可以尝试通过解析ExecutedRoutedEventArgs并检查OriginalSource是否与Source相同来解决此问题,如果是,则执行此命令。
RibbonMenuItem triggers command twice

ndasle7k

ndasle7k2#

另一种解决方法是,您可以使用click事件:

<r:RibbonSplitButton Label="SplitButtonLabel" LargeImageSource="..." Click="Split_Click">
  <r:RibbonSplitMenuItem Header="Item 1" ImageSource="..." Click="Click_1"/>
  <r:RibbonSplitMenuItem Header="Item 2" ImageSource="..." Click="Click_2"/>
  <r:RibbonSplitMenuItem Header="Item 3" ImageSource="..." Click="Click_3"/>
</r:RibbonSplitButton>

在click事件处理程序中,将Handled属性设置为true:

private void Click_1(object sender, RoutedEventArgs e)
{
    e.Handled = true;
    ((YourViewModel)DataContext).Command1();
}
plicqrtu

plicqrtu3#

正如dellywheel所说,这种行为似乎是设计出来的。
我处理了这个问题,改变了我的代码,就像下面的例子。

<r:RibbonSplitButton Label="SplitButtonLabel" LargeImageSource="..." Command="{Binding SplitButtonCommand}">
  <r:RibbonButton Label="Item 1" SmallImageSource="..." Command="{Binding Command1}"/>
  <r:RibbonButton Label="Item 2" SmallImageSource="..." Command="{Binding Command2}"/>
  <r:RibbonButton Label="Item 3" SmallImageSource="..." Command="{Binding Command3}"/>
</r:RibbonSplitButton>

我通过使用RibbonButtons和提供的SmallImageSource替换了RibbonSplitMenuItem的用法

piok6c0g

piok6c0g4#

由于这是一个设计错误:),将Template属性转换为新资源,并从PART_HeaderButtonCOMMANDCOMMANDPARAMETERCOMMANDTARGET中删除TemplateBindings(即完全删除这3个属性),因为它们是导致重复调用命令的“特性”的来源。
如果您愿意,可以将此ControlTemplate应用于所有按钮。

zd287kbt

zd287kbt5#

我使用RibbonMenuItem而不是RibbonSplitMenuItem修复了它。

相关问题