WPF ChromiumWebBrowser是打开和关闭开发工具的最佳方式

时间:2017-07-31 07:43:52

标签: c# wpf cefsharp

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

我通过Command Binding打开我的开发工具:

<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);
        }
    }

扩展的Web浏览器代码具有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键绑定打开和关闭我的开发工具时,它工作正常,但是当我通过关闭窗口&#34;关闭开发工具时,我的代码无法识别。开发工具窗口右上角的按钮:

enter image description here

这个结束没有通知我的属性,因此当下一个命令调用该处理程序时,我的应用程序认为浏览器已打开并尝试关闭它。因此我需要两次调用我的命令来打开开发工具,如果以前关闭它而不是通过我的命令绑定(来自&#34; X&#34;按钮)。

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

1 个答案:

答案 0 :(得分:0)

我简单地(并且即使使用更高版本的CEF Sharp)也有一个按钮/菜单选项,仅显示&#39;显示&#39;开发工具,不用担心跟踪它是打开还是关闭。

ShowDevTools只显示devtools窗口,如果它尚未打开,这样你也不需要对CloseDevTools进行任何调用,或进行任何跟踪。

如果您确实想要跟踪窗口是否已打开,您可以随时使用SetWindowsHookEx API进行实验:

SetWindowsHookEx in C#

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

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