user1614006
user1614006

Reputation: 23

Assign tab content in WPF to a page

I am trying to add dynamic tabs to my application. Right now if I click a button, it will open a new page. What I want is to open this page in a new tab. But when I set up the tab content to a page , the code complains. I wanna do something like this

private void bttnGoToClientsOnClick(object sender, RoutedEventArgs e)
{
    var content = new TextBlock();
    TabItem tab = new TabItem();
    tab.Header = "Search Page";
    SearchPage sp = new SearchPage();
    tab.Content = sp;
    tabControl.Items.Add(tab);
    this.NavigationService.Navigate(sp);
}

is there any way I can convert my page to usercontrol or cast it as user control

Thank you!

Upvotes: 2

Views: 4470

Answers (2)

Konrad Morawski
Konrad Morawski

Reputation: 8394

But when I set up the tab content to a page , the code complains.

It wouldn't hurt if you were more specific here :)

What is SearchPage class? It doesn't seem to be the part of the WPF framework. I googled it up on the http://www.intersoftpt.com/ website. Is that it?

TabItem.Content needs to be of ContentControl type, which SearchPage - apparently - is not. I'm sure you need to embed this SearchPage object in some control presenter, such as a panel, before you can assign it to TabItem.Content.


Update:

Try this, then:

TabItem tab = new TabItem();
tab.Header = "Search Page";
SearchPage sp = new SearchPage();
this.NavigationService.Navigate(sp);
// ---------------------------------------------------- 
var frame = new Frame(); // !
frame.Navigate(sp);  // !
tab.Content = frame; // !
// ---------------------------------------------------- 
tabControl.Items.Add(tab);

While I believe this should work, I haven't tested it. Please let me know if it doesn't do the trick.

Upvotes: 3

MAXE
MAXE

Reputation: 5122

You can always create your own UserControls, directly in the XAML definition (even if they are partial pages or windows).

In this example I assume that your SearchClass is defined in the [YourProject].Model namespace (where [YourProject] is the name of your project)

<UserControl x:Class="WpfApplication1.UserControl1"
             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"
             xmlns:search="clr-namespace:[YourProject].Model">
    <search:SearchClass>
        <!--<Grid>
            ...ANYTHING YOU WANT HERE ! ...
        </Grid>-->
    </search:SearchClass>
</UserControl>

Now you can create an instance of the UserControl, even in XAML or in code-behind (remember only to declare the namespaces correctly!):

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:ctrls="clr-namespace:WpfApplication1"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <UserControl1 />
    </Grid>
</Window>

...and this my code-behind...

UserControl1 myControl = new UserControl1();

Upvotes: 2

Related Questions