How can I force a TabItem to initialize content on load?
Asked Answered
S

2

6

[disclaimer: I am new to Visual Basic.]

In a WPF, I have a TabControl containing 2 TabItems:

The first TabItem contains a bunch of URLs.

The second TabItem consists of a DockPanel that contains a cefSharp webView (chromium embedded for .net)

When I click on a url in tab1 it loads a page in the browser contained in tab2... But, it only works if I have initialized the browser first by clicking on tab2.

After doing some searching, it looks like vb.net doesn't initialize the content in a TabItem until it becomes visible. (right?)

So, my question is, how can I force a non-selected tab to initialize its content on load, in the background? (ie. so I don't have to click on the tab or switch to it first)

EDIT:

As requested, here is the relevant code:

The relevant XAML consists of a single DockPanel named "mainBox"

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

And here is my "code behind" vb script:

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

So, in its default state, tab1 is showing at start up -- the browser on tab2 (web_view2) won't initialize until I click its tab or change to its tab via script. Hope this clears it up a bit.

Swainson answered 31/12, 2013 at 5:25 Comment(3)
post your cs and xaml (RELEVENT cs and xaml ) , of your tab control and the content you wan't to init (that means the class which is given as content to the tabitem .Toxicant
@eran otzap, thanks for taking the time to look this over -- I edited my question with the relevant code.Swainson
There is nice (but still hacky) solution right in this question: #30338476Zepeda
T
6

Your code doesn't use Windows Forms' TabPage but perhaps this might still help

As we know, Controls contained in a TabPage are not created until the tab page is shown, and any data bindings in these controls are not activated until the tab page is shown. This is by design and you can call TabPage.Show() method one by one as a workaround.

via MSDN forums

Also, based on the above idea, have you tried the following.

tab2.isEnabled = True
tab1.isEnabled = True

Or:

tab2.Visibility = True
tab1.Visibility = True

Also, the BeginInit Method might help in your situation.

Tinkling answered 3/1, 2014 at 23:48 Comment(1)
Thanks for the information. It would be nice if the controls not being activated "by design" was based on a bool.Swainson
G
3

I had the same problem but found it initializes if I use the name of the tabpage and show (tabName1.show()) on the form load code for each page ending with the one I want displayed:

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

It ripples thru and you never see the pages changing but it works. The other suggestions didn't work for me in Visual Studio 2010.

Grefer answered 31/8, 2014 at 1:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.