【问题标题】:How can I force a TabItem to initialize content on load?如何强制 TabItem 在加载时初始化内容?
【发布时间】:2014-01-18 02:04:08
【问题描述】:

[免责声明:我是 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) 上的浏览​​器在我单击其选项卡或通过脚本切换到其选项卡之前不会初始化。希望这能澄清一点。

【问题讨论】:

  • @eran otzap,感谢您抽出宝贵时间查看此问题——我使用相关代码编辑了我的问题。
  • 这个问题有一个很好的(但仍然很老套)的解决方案:stackoverflow.com/questions/30337976/…

标签: wpf vb.net tabcontrol cefsharp


【解决方案1】:

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

正如我们所知,Controls contained in a TabPage are not created until the tab page is shown 以及这些控件中的任何数据绑定都不是 激活,直到显示标签页。这是设计使然,您可以 一一调用TabPage.Show()方法作为解决方法。

via MSDN forums

另外,基于上面的思路,你有没有尝试过以下方法。

tab2.isEnabled = True
tab1.isEnabled = True

或者:

tab2.Visibility = True
tab1.Visibility = True

另外,BeginInit Method 可能对您的情况有所帮助。

【讨论】:

  • 感谢您的信息。如果没有“按设计”激活的控件是基于布尔值,那就太好了。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2010-11-17
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多