Как убедиться, что WPF WebBrowser загружен в tabcontrol - PullRequest
0 голосов
/ 08 февраля 2011

У меня есть WebBrowser, встроенный в tabcontrol в моем приложении WPF следующим образом.

<Grid>
    <TabControl SelectionChanged="tabwindow_SelectionChanged">
        <TabItem Header="Preview" Name="PreviewWindow">
            <WebBrowser x:Name="PreviewBrowser" Loaded="PreviewBrowser_OnLoad"/>
        </TabItem>
        <TabItem Header="XML">
            <ew:CommonXmlEditor
                    x:Name="rawXmlEditor"
                    DataContext="{Binding ElementName=XMLDockMainWindow}"
                    ShowLineNumbers="True"
                    FontFamily="Consolas"
                    FontSize="10pt"
                    SyntaxHighlighting="XML"
                    ContextMenu="{StaticResource XmlEditorContextMenu}"/>
        </TabItem>
        <TabItem Header="Not Used">
            The Mushrooms Tab
        </TabItem>
    </TabControl>
</Grid> 

В событии tabwindow_SelectionChanged () я пытаюсь обновить содержимое браузера следующим образом

   private void tabwindow_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        string previewFile = "/session/PreviewXml.data";
        XmlMethodCall.Instance.Put(previewFile, this.XmlEditor.Text, true);
        //WebBrowser browser = new WebBrowser();
        string urlForPreview = XmlMethodCall.Instance.ServerUri.ToString() + "/admin/framework/form_preview.php?path=" + previewFile;
        App app = Application.Current as App;
        string sessionState = XmlMethodCall.Instance.HttpResponse.Headers.Get("Cookie");
        int index = sessionState.IndexOf(";");
        if (index >= 0)
        {
            sessionState = sessionState.Substring(0, index);
        }
        sessionState = sessionState.Replace("ESPSessionState=", "");
        InternetSetCookie(XmlMethodCall.Instance.ServerUri.ToString() + "/admin/", "EspSessionId", sessionState);
        PreviewBrowser.Source = new Uri(urlForPreview);
        PreviewBrowser.Navigate(urlForPreview);
        bool isloa = PreviewBrowser.IsLoaded;
    }

Однако в представлении табуляции всегда отображается первый отображаемый экран веб-браузера.Я должен щелкнуть правой кнопкой мыши и сказать обновить на вкладке, чтобы увидеть обновленное содержимое веб-браузера.При ближайшем рассмотрении проблема отслеживается в веб-браузере, который не загружается, даже если указан другой источник (или вызывается navigate (), refresh () ....).В предыдущем коде логическая переменная isloa имеет значение false.

Может кто-нибудь пролить свет на проблему.Я вижу, что кто-то использовал thread.sleep () в качестве последнего метода в window_loaded, чтобы решить аналогичную проблему.Есть ли лучший подход?

1 Ответ

2 голосов
/ 08 февраля 2011

Джимми, в моем примере ниже, когда вы вводите некоторый URI в текстовое поле Адрес, а затем переключаетесь на вкладку предварительного просмотра - содержимое браузера загружается и отображается как обычно.

<TabControl SelectionChanged="TabControl_SelectionChanged">
    <TabItem Header="Preview" Name="PreviewWindow">
        <WebBrowser x:Name="PreviewBrowser" Loaded="PreviewBrowser_Loaded"/>
    </TabItem>
    <TabItem Header="XML">
        <TextBox Name="Address"/>
    </TabItem>
    <TabItem Header="Not Used">
        The Mushrooms Tab
    </TabItem>
</TabControl>

    private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (string.IsNullOrEmpty(Address.Text))
        {
            PreviewBrowser.Navigate("http://google.com");
        }
        else
        {
            PreviewBrowser.Navigate(Address.Text);
        }
    }

Полагаю, проблема в магии до строки PreviewBrowser.Source. Например, я могу предположить, что в вашем сценарии URI не изменяется (вы просто загружаете другие данные), поэтому при вызове Navigate ничего не происходит, потому что браузер может подумать, что вы запрашиваете ту же страницу.

Попробуйте добавить в URI какой-либо параметр, который варьируется от запроса к запросу, отметка времени будет идеальной ("http://server/?param1=x&param2=y&timestamp="+DateTime.Ticks.ToString()).

...