使用Web浏览器控件构建WPF项目时出错

时间:2014-06-11 04:21:52

标签: c# wpf webbrowser-control

在我的应用程序中,我有一个UserControl我使用WebBrowser控件。

以下是UserControl的代码:

<UserControl x:Class="tool.ucMain"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="354" d:DesignWidth="440">
<Grid>
    <DockPanel>
        <WebBrowser Name="wbMap" DockPanel.Dock="Left" MinWidth="300"></WebBrowser>
        <DataGrid Name="grdSignals" DockPanel.Dock="Right" ItemsSource="{Binding}" AutoGenerateColumns="False">
        </DataGrid>
    </DockPanel>
</Grid>

我在另一个UserControl UserControl中使用此TabControl。这是其他UserControl的代码:

<Grid>
    <TabControl>
        <TabItem Name="tabMain" Header="Main">
            <uc:ucMain />
        </TabItem>
        <TabItem Name="tabDataExplorer" Header="Data Explorer"/>
    </TabControl>
</Grid>

ucMain 是第一个UserControl。当我清理项目时,我可以看到第一个用户控件。但是当我构建/运行它时,它会消失,我会收到错误,如下图所示。即使在设计视图中我也会收到此错误。

enter image description here

2 个答案:

答案 0 :(得分:0)

我通过创建包含WebBrowser的UserControl来复制此行为,并调用该BrowserContainer。然后,我创建了另一个名为BrowserBrowserContainer的UserControl,并添加了我的第一个UserControl。之后,我将BrowserBrowserContainer UserControl添加到我的测试项目的MainWindow.xaml文件中。

当我给WebBrowser一个名称,例如&#34; Browser&#34;,然后将以下代码添加到BrowserContainer的构造函数中时,我得到了与您描述的完全相同的行为。

public BrowserContainer()
{
    InitializeComponent();
    Browser.Source = new Uri("c:\\thisfiledoesntexist");
}

当然,解决方案不是设置Source,或者将其设置为在设计时有效的东西。无论您是否处于设计模式,都会调用无参数构造函数。

答案 1 :(得分:0)

如果您尝试导航到本地文件,则应始终将file:///添加到Uri路径的前面。

修改

我刚试过它,我可以看到主窗口的设计器视图中发生了这个错误。我可以看到Visual Studio试图触发UserControl的Loaded事件。不知何故,AppDomain.CurrentDomain.BaseDirectory返回Visual Studio路径。

跳过此错误的最佳方法可能是使用DesignerProperties.GetIsInDesignMode()

例如,您可以执行以下操作以在设计器视图中跳过此错误。

   private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        if (DesignerProperties.GetIsInDesignMode(this)) return;
        String appdir = System.IO.Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory);
        String mapPath = System.IO.Path.Combine(appdir, "MAP.html");
        ResultWebBrowser.Navigate(new Uri("file:///" + mapPath));
    }