【问题标题】:How to Load a WPF window in the MainWindow as a TabControl item?如何在 MainWindow 中将 WPF 窗口加载为 TabControl 项?
【发布时间】:2017-08-28 09:34:21
【问题描述】:

我的 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' 根元素对导航无效。”

【问题讨论】:

  • Inventory 和其他选项卡内容是UserControl 或其他类型的窗口内容 而不是Window 怎么样?我认为如何创建 N 个单独的 TabItem 内容的问题比回答如何加载嵌套窗口(您可能不需要)更容易回答。
  • @grek40 感谢您的回答,您对创建 N 个单独的 TabItem 内容有何看法?
  • 如果这是您的要求,我可以为 “主要基于意见” 投票赞成这个问题。请遵循问题指南并陈述您的具体问题,而不是征求意见。
  • 实际上我在第一行问了我的问题“问题是我的 MainWindow.xaml 目前是 ~4000 行代码,效率不高(你同意吗?)”引发此问题的问题问题是“效率”。
  • 当然第二个问题是你和mm8回答的错误:)

标签: c# wpf xaml frame tabitem


【解决方案1】:

一个窗口不能是另一个元素的子元素。期间。

但是您可以将 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();

【讨论】:

  • 谢谢亲爱的@mm8 我知道了,没有窗口。你对整件事有什么看法?这是减轻 mainwindows.xaml 的必要条件还是不需要?
  • 好吧,如果 MainWindow 的内容那么大,我想将代码分成几个不同的 UserControl 是有意义的。注意,可以直接将 TabItem 的 Content 设置为 UserControl,不需要 Frame。
【解决方案2】:

使用 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多