当前位置: 首页 > 知识库问答 >
问题:

WPF使用ICommand在WebBrowser中创建带有ContextMenu的ListView

东郭阳德
2023-03-14

我试图在WebBrowser中创建一个带有ContextMenu的ListView,然后使用ICommand进行绑定。但是,下面列出的示例在运行时,我会得到以下错误:System.Windows.Data错误:4:无法找到引用'RelativeSource FindAncestor,祖先Type='System.Windows.Controls.ListView',祖先Level='1''的绑定源。BindingExpression:path=datacontext.mycode;DataItem=null;目标元素是'menuitem'(name='');目标属性为“Command”(类型为“Icommand”)

        <!--WebBrowser to Display Messages-->
        <WebBrowser Name="webBrowser"
                    Source="http://www.whatever.com" 
                   <!--OnContextMenuOpening event in LoadCompleted-->                       
                    LoadCompleted="webBrowser_LoadCompleted">

            <WebBrowser.Resources>
                <!--Show items on webBrowser on mouserightclick-->
                <ListView x:Key="wbListView">
                    <ListView.Resources>
                        <ContextMenu x:Key="wbContextMenu" >
                            <MenuItem Header="Test" CommandParameter="{Binding}" Command="{Binding Path=DataContext.myCode, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListView}}"/>
                        </ContextMenu>
                    </ListView.Resources>
                    <ListView.ItemContainerStyle>
                        <Style TargetType="{x:Type ListViewItem}">
                            <Setter Property="ContextMenu" Value="{StaticResource wbContextMenu}"/>
                        </Style>
                    </ListView.ItemContainerStyle>
                </ListView>
            </WebBrowser.Resources>

        </WebBrowser>

下面是我的代码:C#

    public myCodeCommand myCode
    {
        get { return new myCodeCommand(this); }
    }

    public class myCodeCommand : ICommand
    {           
        public bool CanExecute(object parameter)
        {
            Console.WriteLine("WEBBROWSER SEND MESSAGE CAN EXECUTE?");
            return true;
        }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        public void Execute(object parameter)
        {
            Console.WriteLine("WEBBROWSER SEND MESSAGE EXECUTE SOMETHING");
        }
    }

共有1个答案

陶山
2023-03-14

我能够在Xaml中创建ContextMenu,如下所示:

     <WebBrowser.ContextMenu>
          <ContextMenu x:Name="wbContextMenu" >
               <MenuItem x:Name="menuItemOne" Header="Item 1" Click="menuItemOne_Click" />
               <MenuItem x:Name="menuItemTwo" Header="Item 2" Click="menuItemTwo_Click" />
          </ContextMenu>
     </WebBrowser.ContextMenu>

在wbContextMenu事件处理程序上,如下所示:仅供参考,每个菜单项都有自己的ClickEvent。

    DocumentEvents.oncontextmenu += webBrowserChat_ContextMenuOpening;

    private bool webBrowserChat_ContextMenuOpening(IHTMLEventObj pEvtObj)
    {
           wbContextMenu.PlacementTarget = pEvtObj as ContextMenu;
           wbContextMenu.IsOpen = true;
     }

    private void menuItemOne_Click(object sender, RoutedEventArgs e)
    {
           //Put whatever you want handled here for menuitem
    }

    private void menuItemTwo_Click(object sender, RoutedEventArgs e)
    {
           //Put whatever you want handled here for menuitem
    }
 类似资料:
  • 我在这里遇到了TreeView绑定和ContextMenu的问题:Selected TreeView项为空 现在我有这个问题:我有ContextMenu (图片显示了我的ContextMenu的样子,不要介意tabItem...)。 正如你所看到的,它只是ContetMenu,没有MenuItem!如果用户单击“关闭”,我想在ViewModel中执行一些操作(发出命令?)。我还想知道他点了哪个按钮

  • 使用带有restful Webservices的open cmis在Alfresco中创建文件夹 我如何使用Open Cmis和RESTFul Webservices在Alfresco中创建文件夹?我尝试了,但它显示以下错误: 请提前帮我解决这个错误。。 web.xml网站

  • 为2020年更新,我链接了我的文章,在文章中我比较了在基本Windows桌面应用程序中托管HTML WebView的不同方法的内存占用: MSedge WebView2 WPF Chromely/CEFSharp 电子V10 旧版IE11 WebBrowser WPF。 基于Internet Explorer的WPF WebBrowser控件存在一些键盘和焦点问题以及内存泄漏问题。作为这些问题的替

  • 问题内容: 两者之间到底有什么区别 和 第一个只是加快字段初始化速度的捷径吗?有性能方面的考虑吗? 问题答案: 第二种形式总是创建一个空的地图。 第一种形式是地图文字的特殊情况。地图文字允许创建 非空 地图: 现在,您的(通用)示例: 是没有初始值(键/值对)的地图文字。它完全等同于: 此外,这是为地图指定初始容量(大于初始分配的元素数量)的唯一方法。例: 将创建一个地图,该地图具有足够的空间来容

  • 要为数据库创建授权,我使用以下salt模块 但它创造了我这个 即它为我创建了这个赠款 将keystone.*上的所有特权授予keystone@localhost 但我需要创建这个赠款 将keystone.*上的所有特权授予由“password”标识的“keystone”@“localhost”; 有人能建议我如何使用SaltStack添加带有密码的授权吗