5

[免责声明:我是 Visual Basic 的新手。]

在 WPF 中,我有一个包含 2 个 TabItems 的 TabControl:

第一个 TabItem 包含一堆 URL。

第二个 TabItem 由一个 DockPanel 组成,该 DockPanel 包含一个 cefSharp webView(用于 .net 的铬嵌入)

当我单击 tab1 中的 url 时,它会在 tab2 中包含的浏览器中加载一个页面......但是,它只有在我首先通过单击 tab2 初始化浏览器时才有效。

在进行了一些搜索之后,看起来 vb.net 不会初始化 TabItem 中的内容,直到它变得可见。(正确的?)

所以,我的问题是,如何强制未选择的选项卡在加载时在后台初始化其内容?(即,所以我不必先单击选项卡或切换到它)

编辑:

根据要求,以下是相关代码:

相关的 XAML 由一个名为“mainBox”的 DockPanel 组成

<DockPanel Name="mainBox" Width="Auto" Height="Auto" Background="#afe0ff" />

这是我的“代码背后”vb脚本:

Class MainWindow : Implements ILifeSpanHandler, IRequestHandler

    Shared web_view1 As CefSharp.Wpf.WebView
    Shared web_view2 As CefSharp.Wpf.WebView

    Public Sub init(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Loaded

    'This is in a DockPanel created on the xaml named mainBox

        ' set up tabControl:
        Dim browserTabs As New TabControl()
        browserTabs.BorderThickness = Nothing

        Dim tab1 As New TabItem()
        tab1.Header = "My Tab"

        Dim tab2 As New TabItem()
        tab2.Header = "Browser"

        Dim tab1Content As New DockPanel()
        Dim tab2Content As New DockPanel()

        tab1.Content = tab1Content
        tab2.Content = tab2Content

        browserTabs.Items.Add(tab1)
        browserTabs.Items.Add(tab2)

        mainBox.Children.Add(browserTabs)

        ' set up browsers:
        Dim settings As New CefSharp.Settings()
        settings.PackLoadingDisabled = True

        If CEF.Initialize(settings) Then

            web_view1 = New CefSharp.Wpf.WebView()
            web_view1.Name = "myTabPage"
            web_view1.Address = "http://stackoverflow.com/"

            web_view2 = New CefSharp.Wpf.WebView()
            web_view2.Name = "browserPage"
            web_view2.Address = "https://www.google.com"
            web_view2.LifeSpanHandler = Me
            web_view2.RequestHandler = Me

            AddHandler web_view2.PropertyChanged, AddressOf web2PropChanged

            tab1Content.Children.Add(web_view1)
            tab2Content.Children.Add(web_view2)

        End If

    End Sub
End Class

因此,在其默认状态下,tab1 在启动时显示——tab2 (web_view2) 上的浏览​​器在我单击其选项卡或通过脚本更改到其选项卡之前不会初始化。希望这能澄清一点。

4

2 回答 2

6

您的代码不使用 Windows 窗体,TabPage但也许这仍然有帮助

众所周知,TabPage 中包含的控件在显示标签页之前不会创建,并且在显示标签页之前不会激活这些控件中的任何数据绑定。这是设计使然,您可以TabPage.Show()一个一个地调用方法作为解决方法。

通过 MSDN 论坛

另外,基于上述思路,您是否尝试过以下方法。

tab2.isEnabled = True
tab1.isEnabled = True

或者:

tab2.Visibility = True
tab1.Visibility = True

此外,BeginInit 方法可能对您的情况有所帮助。

于 2014-01-03T23:48:42.437 回答
3

我遇到了同样的问题,但发现如果我使用标签页的名称并在表单加载代码上显示(tabName1.show()),它会初始化,每个页面都以我想要显示的页面结尾:

tabPage2.show()
tabPage3.show()
tabPage4.show()
tabPage5.show()
tabPage1.show()

它会泛起涟漪,你永远不会看到页面发生变化,但它确实有效。其他建议在 Visual Studio 2010 中对我不起作用。

于 2014-08-31T01:07:28.593 回答