在xaml中使用自定义RoutedUICommand会引发异常

Dzy*_*ann 6 c# wpf xaml

我按照这个文章和其他一些人来创建自定义RoutedUICommand.我正在使用Infragistics Ribbon,但我不认为问题来自那里.

<igRibbon:XamRibbonWindow x:Class="MyRibbonWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:igRibbon="http://infragistics.com/Ribbon"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:MyNamespaceTag="clr-namespace:MyNamespace"
xmlns:igWPF="http://schemas.infragistics.com/xaml/wpf" mc:Ignorable="d" 
WindowState="Maximized">    
<igRibbon:XamRibbonWindow.Resources>
<!-- Some DataTempaltes here -->
</igRibbon:XamRibbonWindow.Resources>
<igRibbon:RibbonWindowContentHost x:Name="ribbonWindowContentHost" >
  <igRibbon:RibbonWindowContentHost.Ribbon>
    <igRibbon:XamRibbon x:Name="xamRibbon" Theme="[current]">
      <igRibbon:XamRibbon.ApplicationMenu>
        <igRibbon:ApplicationMenu>
          <igRibbon:ApplicationMenu.FooterToolbar>
            <igRibbon:ApplicationMenuFooterToolbar>
              <igRibbon:ButtonTool Name="appMenuOptions" Caption="Opt_ions"/>
            </igRibbon:ApplicationMenuFooterToolbar>
           </igRibbon:ApplicationMenu.FooterToolbar>
      </igRibbon:ApplicationMenu>
    </igRibbon:XamRibbon.ApplicationMenu>
   </igRibbon:XamRibbon>
  </igRibbon:RibbonWindowContentHost.Ribbon>       
  <ContentControl Content="{Binding MyContent}"
      ContentTemplateSelector="{StaticResource myContentTemplateSelector}" />       
</igRibbon:RibbonWindowContentHost>    
</igRibbon:XamRibbonWindow>
Run Code Online (Sandbox Code Playgroud)

我们需要改变Infragistics Ribbon的外观和感觉,Infragistics社区的团队成员建议添加Style.问题是,当我们将它添加到功能区的"资源"部分时,它不起作用.所以我们被迫做了以下事情:

var resourceDictionary = new ResourceDictionary();
resourceDictionary.Source = new Uri(
    @"/MyNamespace;component/Resources/RibbonResources.xaml", 
    UriKind.RelativeOrAbsolute);
xamRibbon.Resources.MergedDictionaries.Add(resourceDictionary);
Run Code Online (Sandbox Code Playgroud)

这适用于功能区中的样式,但在RibbonResources.xaml中我们有一个按钮:

<Button Name="myButton" 
    Command="MyNamespaceTag:MyCommands.MyCommand" 
    Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}">
    <Image Source="MyImage.png" Width="16" Height="16" />
</Button>
Run Code Online (Sandbox Code Playgroud)

MyCommand和MyCommands类的创建完全与我提到的文章一样.但是当我运行应用程序时,我收到以下错误:

XamlParseException:无法从文本MyNamespace创建"命令":MyCommands.MyCommand'InstoutException:类型引用找不到名为'{clr-namespace:MyNamespace} MyCommands'的类型.

如果我使用这样的命令:

Command="{x:Static MyNamespaceTag:MyCommands.MyCommand}"
Run Code Online (Sandbox Code Playgroud)

我得到以下异常:

XamlParseException:在'System.Windows.Markup.StaticExtension'上提供值引发异常.InnerException:类型引用找不到名为'{clr-namespace:MyNamespaces} MyCommands'的类型.

在代码隐藏中,我们绑定命令如下:

CommandBindings.Add(
    new CommandBinding(
        MyCommands.MyCommand, 
        Show, 
        CanShow));
Run Code Online (Sandbox Code Playgroud)

如果我们将按钮直接放在我们拥有XamRibbonWindow的位置,它就可以正常工作.

我仍然是WPF的新手,我无法弄清楚我做错了什么.

Ste*_*ook 1

您走在正确的道路上MyNamespace:MyCommands.MyCommand。看起来您MyNamespace在 xaml 文件中包含了“Shell”。在顶部的igRibbon:XamRibbonWindow标签中,您应该包含一个xmlns:MyNamespace=[whatever]属性,或者将命令从

MyNamespace:MyCommands.MyCommand

Shell:MyCommands.MyCommand