【问题标题】:WPF ChromiumWebBrowser the best way to open and close development toolsWPF ChromiumWebBrowser 打开和关闭开发工具的最佳方式
【发布时间】:2017-07-31 07:43:52
【问题描述】:

我有使用 ChromiumWebBrowser CefSharp.Wpf.dll 49.0.0.0 的标准 WPF 应用程序。 将版本升级到最新版本将是真正的噩梦,因此我不能将其视为一种选择。 我有一个关于打开和关闭开发工具的小错误:

我通过命令绑定打开我的开发工具:

<FrameworkElement.Resources>
    <views:FreezableProxyClass x:Key="ProxyElement"
                               ProxiedDataContext="{Binding Source={x:Reference This}, Path=DataContext}" />
</FrameworkElement.Resources>
<FrameworkElement.ContextMenu>
    <ContextMenu>
        <MenuItem Command="{Binding OpenDevToolsCommand}"
                  Header="Open Chrome Dev Tools">
            <MenuItem.Icon>
                <Image Source="../../Images/dev_tools_20x20.png"
                       Width="20"
                       Height="20" />
            </MenuItem.Icon>
        </MenuItem>
    </ContextMenu>
</FrameworkElement.ContextMenu>

<FrameworkElement.InputBindings>
    <KeyBinding Key="F12"
                Command="{Binding Source={StaticResource ProxyElement}, 
            Path=ProxiedDataContext.OpenDevToolsCommand}" />

</FrameworkElement.InputBindings>
<browser:WebBrowserEx BrowserContainer="{Binding}" />

命令处理程序代码:

  private void OpenDevToolsCommandHandler()
    {
        if (Browser.IsBrowserInitialized)
        {
            Browser.ForceShowingDevTools = !Browser.ForceShowingDevTools;
        }
        else
        {
            MessageBox.Show("Wait till the full browser initialization", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
        }
    }

并且扩展的网络浏览器代码具有ForceShowingDevTools 依赖属性:

 public bool ForceShowingDevTools
    {
        get { return (bool)GetValue(ForceShowingDevToolsProperty); }
        set { SetValue(ForceShowingDevToolsProperty, value); }
    }

    // Using a DependencyProperty as the backing store for ForceShowingDevTools.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ForceShowingDevToolsProperty =
        DependencyProperty.Register("ForceShowingDevTools", typeof(bool), typeof(WebBrowserEx), new PropertyMetadata(false,
            (o, e) =>
            {
                WebBrowserEx browserEx = o as WebBrowserEx;
                if (browserEx != null)
                {
                    if ((bool)e.NewValue)
                    {
                        browserEx.ShowDevTools();
                    }
                    else
                    {
                        browserEx.CloseDevTools();
                    }

                }
            }));

ShowDevToolsCloseDevTools 取自原始WebBrowserExtensions 类。

当我仅通过上下文菜单或 F12 键绑定打开和关闭我的开发工具时它工作正常,但是当我通过开发工具窗口右上角的“关闭窗口”按钮关闭开发工具时我的代码无法识别:

此关闭不会通知我的属性,因此当下一个命令调用该处理程序时,我的应用程序认为浏览器已打开并尝试关闭它。因此如果之前不是通过我的命令绑定(从“X”按钮)关闭的,我需要调用我的命令两次才能打开开发工具

是否有其他选项可以打开和关闭开发工具?

【问题讨论】:

  • CefSharp 的最新版本是57.0.0。你能用CefSharp.Wpf.Example 复制这个吗?克隆github.com/cefsharp/CefSharp 并进行测试。 :)
  • 正如我上面写的,更新到最新版本将是一场噩梦。意思是,如果我可以在更新和保留此错误之间做出选择 - 我更愿意保留此错误。
  • 啊,抱歉。我使用master 分支(58.0.0)对其进行了测试,因为我碰巧打开了它,我无法复制它。猜测它自 49.0.0 以来已修复。我经常发现升级CefSharp 很轻松,但我完全理解如果您的环境无法做到这一点。
  • 这没有意义:CefSharp的任何变化,无论是升级还是降级,都太痛苦了。无论如何,谢谢。

标签: c# wpf cefsharp


【解决方案1】:

我只是(并且会这样做,即使是 CEF Sharp 的更高版本)有一个按钮/菜单选项来仅“显示”开发工具,而不必担心跟踪它是打开还是关闭。

ShowDevTools 只是在 devtools 窗口尚未打开时显示它,这样您也不需要调用 CloseDevTools 或进行任何跟踪。

如果您真的想跟踪窗口是否打开,您可以随时使用 SetWindowsHookEx API 进行试验:

SetWindowsHookEx in C#

https://msdn.microsoft.com/en-us/library/ms644990(VS.85).aspx

..这不是我自己用过的东西。

【讨论】:

  • 抱歉,我不清楚您的解决方案的描述。
猜你喜欢
  • 2014-11-28
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-31
  • 2019-10-05
相关资源
最近更新 更多