Как загрузить окно WPF в MainWindow как элемент TabControl?

Структура моего MainWindow.xaml приведена ниже.

<Window>
   <Grid>
    <TabControl Name="MainTabCntrl">
       <TabItem1>
       <TabItem2>
       <TabItem3>
       .
       .
       .
       <TabItemN>
    </TabControl>
   </Grid>
</Window>

Проблема в том, что мой MainWindow.xaml в настоящее время составляет ~ 4000 строк кода, что неэффективно (вы согласны?). Решение, которое я пытаюсь реализовать, состоит в том, чтобы создать N окон (представляющих мои TabItems) отдельно и каждый раз, когда пользователь щелкает на элементах Tab я загружаю соответствующие окна в этом TabItem, как показано ниже

 private void inventory_start()//this function is called in my MainWinodw.xaml.cs
        {
            inv = new Inventory(db, logViewer);//this is a window
            TabItem tbItem = new TabItem();
            Frame frame = new Frame();
            frame.Content = inv;
            tbItem.Name = "invTab";
            tbItem.Content = frame;
            tbItem.IsSelected = true;
            MainTabCntrl.Items.Add(tbItem);
            inv.swithInventoryTabs("inv_info");
        }

Теперь у меня ошибка: «Корневой элемент Management_V0.Inventory недопустим для навигации».


person Amir    schedule 28.08.2017    source источник
comment
Как насчет того, чтобы Inventory и другое содержимое вкладки были UserControl или другим видом окна Content вместо Window? Я думаю, что есть более простые ответы на вопрос, как создать N отдельных содержимого TabItem, чем на то, как загружать вложенные окна (которые вам, вероятно, все равно не нужны).   -  person grek40    schedule 28.08.2017
comment
@ grek40 Спасибо за ваш ответ, каково ваше мнение о создании N отдельных содержимого TabItem?   -  person Amir    schedule 28.08.2017
comment
Я могу проголосовать за этот вопрос как в первую очередь основанный на мнении, если это то, о чем вы просите. Пожалуйста, следуйте инструкциям по вопросам и излагайте свои конкретные проблемы вместо того, чтобы спрашивать мнения.   -  person grek40    schedule 28.08.2017
comment
На самом деле я задал свой вопрос в первой строке. Проблема в том, что мой MainWindow.xaml в настоящее время составляет ~ 4000 строк кода, что неэффективно (вы согласны?). Проблема, которая поднимает этот вопрос, - это эффективность.   -  person Amir    schedule 28.08.2017
comment
И, конечно же, второй вопрос был ошибкой, на которую ответили вы и mm8 :)   -  person Amir    schedule 28.08.2017
comment
Но эффективность не является рациональной вещью. В зависимости от бизнес-модели получение результата в течение часа может быть эффективным или может потребоваться получение результатов в течение нескольких миллисекунд. Ваша текущая реализация занимает больше часа? Если нет, то почему вы хотите его изменить?   -  person grek40    schedule 28.08.2017


Ответы (2)


Окно не может быть дочерним элементом другого элемента. Период.

Но вы можете просто переместить содержимое окна Inventory в окно UserControl (например, просто скопировав и вставив XAML и код из одного файла в другой) и использовать это как Content окна Inventory и Frame:

<Window x:Class="WpfApplication1.Inventory"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="Inventory" Height="300" Width="300">
    <local:UserControl1 />
</Window>

Frame frame = new Frame();
frame.Content = new UserControl1();
person mm8    schedule 28.08.2017
comment
Спасибо, дорогой @mm8, я понял, без окна. и каково ваше мнение обо всем этом? это необходимо для облегчения mainwindows.xaml или нет? - person Amir; 28.08.2017
comment
Что ж, если содержимое MainWindow такое большое, я думаю, имеет смысл разделить код на несколько разных пользовательских элементов управления. Обратите внимание, что вы можете напрямую установить содержимое TabItem в UserControl, вам не нужен фрейм. - person mm8; 28.08.2017

лучший способ использовать tabControl — это пользовательский элемент управления: пример ниже: XAML

 <TabControl >
                <TabItem x:Name="tab1" Header="UserControl"></TabItem>
                <TabItem x:Name="tab2" Header="noControl"></TabItem>
            </TabControl>

и в коде за классом:

  tab1.Content = new UserControl1();

а затем добавить новый пользовательский элемент управления с именем UserControl1:

<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" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <Viewbox>
            <TextBlock Text="User Control"/>
        </Viewbox>
    </Grid>
</UserControl>
person Ali Imran    schedule 28.08.2017