【问题标题】:Wpf- Unable to cast MenuItem to Listbox?Wpf-无法将 MenuItem 投射到列表框?
【发布时间】:2011-05-27 23:41:58
【问题描述】:

我遇到了一个非常奇怪的异常。 我得到了例外:

"'Set connectionId threw an exception.' Line number '26' and line position '34'."

当我查看内部异常时,我得到:

"Unable to cast object of type 'System.Windows.Controls.MenuItem' to type 'System.Windows.Controls.ListBox'."

我已将异常原因缩小到此TreeView 中包含的TreeViewItem 样式中的MenuItem

<TreeView x:Name="ProjectElementTreeView" ItemsSource="{Binding ProjectElementCollection}"  DisplayMemberPath="Name" Padding="0" SelectedItemChanged="ProjectElementTreeView_SelectedItemChanged" GotKeyboardFocus="ProjectElementTreeView_GotKeyboardFocus">
        <TreeView.Resources>
            <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="HorizontalAlignment" Value="Left" />
                <Setter Property="ContextMenu">
                    <Setter.Value>
                        <ContextMenu>
                            <MenuItem Name="AddProjectElementMenuItem" Header="Add" Click="AddProjectElementMenuItem_Click"/>
                        </ContextMenu>
                    </Setter.Value>
                </Setter>
            </Style>
        </TreeView.Resources>
    </TreeView>

该异常仅在MenuItem 有点击事件处理程序时发生,即使点击事件处理程序不包含任何代码也会引发。

【问题讨论】:

  • 哇,这真的很奇怪......
  • 发布的代码对我来说效果很好,所以我认为您的问题出在另一段代码中。什么尝试设置 ConnectionId?

标签: wpf exception xaml


【解决方案1】:

我已经复制了您的代码,它适用于我。您确定是您发布的代码导致了问题吗?

不要将MenuItem放在ContextMenu的内容中,而是将其嵌套在ContextMenu.Items下:

<ListBox.ContextMenu>
    <ContextMenu>
        <ContextMenu.Items>
            <MenuItem Name="AddProjectElementMenuItem"></MenuItem>
        </ContextMenu.Items>
    </ContextMenu>
</ListBox.ContextMenu>a

【讨论】:

  • 仍然导致异常。同样,只有在 MenuItem 附加了单击事件时才会发生异常。
  • 是的,我确实使用附加的事件处理程序对其进行了测试。我认为您发布的 xaml 没有任何问题 - 一定是机器/配置问题。
  • 你(都)用什么版本来试试这个。 [免责声明:我自己没有尝试过 - 只是想确保您将橙子与橙子进行比较。]
【解决方案2】:

我遇到了和你一样的例外。仔细查看代码后,感觉就像您会遇到这种情况

"无法指定事件‘点击’ 在样式中的目标标记上。使用 而是 EventSetter。”

我不确定为什么这里不适用。
无论如何,使用 EventSetter 是可行的

<Setter Property="ContextMenu">
    <Setter.Value>
        <ContextMenu>
            <MenuItem Name="AddProjectElementMenuItem" Header="Add">
                <MenuItem.Style>
                    <Style TargetType="MenuItem">
                        <EventSetter Event="Click" Handler="AddProjectElementMenuItem_Click"/>
                    </Style>
                </MenuItem.Style>
            </MenuItem>
        </ContextMenu>
    </Setter.Value>
</Setter>

【讨论】:

    【解决方案3】:

    我不得不自己面对这种奇怪的情况。 有一个简单的方法可以克服它,您必须清理并重建项目,异常就会消失。


    希望这会有所帮助。

    【讨论】:

    • 我不得不更进一步,关闭VS并删除项目文件夹中的objbin目录。
    • 这些都不适合我,最终不得不使用事件设置器。
    【解决方案4】:

    我遇到了这个错误,发现我把标签放在&lt;MyApp:AppPage.Resources&gt;&lt;/MyApp:AppPage.Resources&gt; 之外,我的意思是我知道它必须在里面,但我没有注意到在我的上下文菜单标签之前已经调用了结束标签。我以为我还在里面。我只是将它移到结束标记之前,它按预期工作。

    【讨论】:

      【解决方案5】:

      Fredrik's answer 解释了造成这种情况的真正原因,我想。但这里有一个替代解决方案。

      您还可以通过将ContextMenu 声明为Style 之外的单独资源来解决此问题:

      <TreeView x:Name="ProjectElementTreeView" ItemsSource="{Binding ProjectElementCollection}"  DisplayMemberPath="Name" Padding="0" SelectedItemChanged="ProjectElementTreeView_SelectedItemChanged" GotKeyboardFocus="ProjectElementTreeView_GotKeyboardFocus">
          <TreeView.Resources>
              <ContextMenu x:Key="Menu">
                  <MenuItem Name="AddProjectElementMenuItem" Header="Add"
                            Click="AddProjectElementMenuItem_Click"/>
              </ContextMenu>
              <Style TargetType="{x:Type TreeViewItem}">
                  <Setter Property="HorizontalAlignment" Value="Left" />
                  <Setter Property="ContextMenu" Value="{StaticResource Menu}" />
              </Style>
          </TreeView.Resources>
      </TreeView>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-13
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        • 2018-01-23
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多