簡體   English   中英

如何通過XAML在WPF TabControl中添加控件

[英]How to add controls inside WPF TabControl via XAML

我有以下XAML ,一個TabControl綁定到ObservableCollection並創建我的選項卡就好了。

<Window x:Class="BA_Auditing.AuditWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="BizeAsset - Audit Results" Height="700" Width="1120" WindowStartupLocation="CenterScreen" WindowState="Maximized">
    <Grid>
        <TabControl Name="ModuleTabControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5" ItemsSource="{Binding}" >
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock>                            
                        <TextBlock Text="{Binding DISPLAY_NAME}"/>
                    </TextBlock>
                </DataTemplate>
            </TabControl.ItemTemplate>

            <TabControl.ContentTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition />
                            <RowDefinition Height="Auto" />
                            <RowDefinition />
                        </Grid.RowDefinitions>
                        <Grid Grid.Row="0">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition />
                                <ColumnDefinition />
                            </Grid.ColumnDefinitions>
                            <TextBlock Grid.Column="0" Text="Search:" HorizontalAlignment="Right"/>
                            <TextBox x:Name="tbxSearch" Grid.Column="1"/>
                        </Grid>
                        <TextBlock Grid.Row="2" Text="Items Selected: 0 of 908" />
                    </Grid>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
</Window>

接下來,我想用下一級別的控件填充每個選項卡區域,其中包括LabelTextBox另一個TabControlTextBlock

我以前是在WinForms寫的,它看起來像這樣:

在此處輸入圖片說明

我需要添加什么XAML才能執行此操作?
那是因為我通過綁定而不是從字面上添加TabItem來動態設計它

[編輯]
我試圖將控件輸入到TabControl.ContentTemplate但是TabItem的主體中沒有任何顯示。
在此處輸入圖片說明

我認為,如果您在"WW - Wastewater"選項卡上“單擊”,將會看到正在生成的內容(“搜索”框等)-這是因為默認情況下未選中該選項卡。

無論如何,這里有一些代碼使您更接近所需的內容-只是為了讓您入門,您需要添加其他管道代碼(更改通知等)。

我不知道您打算在“服務”選項卡中擁有什么,等等...所以不知道您是否可以用與“資產”相同的方式來處理它們。 另外,您可能想要顯式定義網格列的名稱,而不是自動生成它們-在其他地方您可以找到一些方法來做到這一點。

在此處輸入圖片說明

<Window x:Class="WpfApp38.MainWindow"
        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:WpfApp38"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TabControl Name="ModuleTabControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5" ItemsSource="{Binding}" SelectedIndex="0" >
            <TabControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock>                            
                        <TextBlock Text="{Binding DISPLAY_NAME}"/>
                    </TextBlock>
                </DataTemplate>
            </TabControl.ItemTemplate>

            <TabControl.ContentTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto"/>
                            <RowDefinition Height="*" />
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                            <Grid Grid.Row="0">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition />
                                    <ColumnDefinition />
                                </Grid.ColumnDefinitions>
                                <TextBlock Grid.Column="0" Text="Search:" HorizontalAlignment="Right"/>
                                <TextBox x:Name="tbxSearch" Grid.Column="1"/>
                            </Grid>
                        <TabControl Grid.Row="1" ItemsSource="{Binding SubCategories}">
                            <TabControl.ItemTemplate>
                                <DataTemplate>
                                    <TextBlock Text="{Binding DISPLAY_NAME}"/>
                                </DataTemplate>
                            </TabControl.ItemTemplate>
                            <TabControl.ContentTemplate>
                                <ItemContainerTemplate>
                                    <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Assets}">
                                    </DataGrid>
                                </ItemContainerTemplate>
                            </TabControl.ContentTemplate>
                        </TabControl>
                        <TextBlock Grid.Row="2" Text="Items Selected: 0 of 908" />
                    </Grid>
                </DataTemplate>
            </TabControl.ContentTemplate>
        </TabControl>
    </Grid>
</Window>

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp38
{
    public class InfrastructureCateogry
    {
        public string DISPLAY_NAME { get; set; }

        public ObservableCollection<AssetCategory> SubCategories { get; set; }
    }

    public class AssetCategory
    {
        public string DISPLAY_NAME { get; set; }

        public ObservableCollection<AssetRecord> Assets { get; set; }
    }

    public class AssetRecord
    {
        public string AssetID { get; set; } // make it an int
        public string AssetType { get; set; }
        public string LastUpdateBy { get; set; } // make this a DateTime object
        public string LastUpdateDate { get; set; } // make this a DateTime object
    }

    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        private ObservableCollection<InfrastructureCateogry> infrastructurecategories = new ObservableCollection<InfrastructureCateogry>();

        public MainWindow()
        {
            InitializeComponent();

            var x = new InfrastructureCateogry()
            {
                DISPLAY_NAME = "AR - Roads and Bridges",
                SubCategories = new ObservableCollection<AssetCategory>
                {
                    new AssetCategory
                    {
                        DISPLAY_NAME = "Lines",
                        Assets = new ObservableCollection<AssetRecord>
                        {
                            new AssetRecord
                            {
                                AssetID = "20040927104600",
                                AssetType = "Gravity Main",
                                LastUpdateDate = "07/05/2015 17:01:55 PM"
                            },
                            new AssetRecord
                            {
                                AssetID = "20150507170116",
                                AssetType = "Relined",
                                LastUpdateDate = "07/05/2015 17:01:15 PM"
                            }
                        }
                    },
                    new AssetCategory
                    {
                        DISPLAY_NAME = "Points"
                    },
                    new AssetCategory
                    {
                        DISPLAY_NAME = "Plant/Components"
                    },
                    new AssetCategory
                    {
                        DISPLAY_NAME = "Services"
                    }
                }
            };

            infrastructurecategories.Add(x);

            var x2 = new InfrastructureCateogry();
            x2.DISPLAY_NAME = "WW - WasteWater";

            infrastructurecategories.Add(x2);

            this.DataContext = infrastructurecategories;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM