WPF如何创建标签项

时间:2011-07-20 08:41:00

标签: c# .net wpf tabcontrol

标签项的数量未预先确定。我只想创建新的标签项,然后在当前项目中添加新的矩形。 我正在生成新的标签项(下面是代码)但是如何在当前标签中添加矩形?

var _FloorName = (from fn in db.floors select fn.floorname).ToList();

if (_FloorName.Count > 0)
{
    for (int i = 0; i < _FloorName.Count; i++)
    {
        tabControl1.Items.Add(_FloorName[i]);
    }
}

3 个答案:

答案 0 :(得分:3)

您可以采取以下一种方法:

  • 在创建<{li>>时为每个TabItem添加Grid(或其他容器)
  • 使用您想要的画笔/尺寸
  • 创建Rectangle
  • 致电tabControl1.SelectedContent,将其投放到Grid(或您的容器类型)
  • 致电grid.Children.Add(rectangle)

这是一个完整的代码示例(使用大量代码隐藏)。

MainWindow.xaml:

<Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Margin="12">
        <TabControl Name="tabControl1" Height="250" />
        <Button Content="Add Rectangle" Click="Button_Click"
                Width="90" Height="25" Margin="5" />
    </StackPanel>
</Window>

MainWindow.xaml.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;

public class Floor
{
    public Floor(string name = null)
    {
        this.Name = name;
    }

    public string Name { get; set; }
}

public class FakeDb
{
    public IEnumerable<Floor> Floors
    {
        get
        {
            return new List<Floor>()
            {
                new Floor("floor1"),
                new Floor("floor2"),
                new Floor("floor3"),
            };
        }
    }
}

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        InitializeTabControl();
    }

    private void InitializeTabControl()
    {
        var db = new FakeDb();
        var floorNames = (from fn in db.Floors select fn.Name).ToList();

        foreach (string floorName in floorNames)
        {
            var item = new TabItem()
            {
                Header = floorName,
                Content = new Grid(),
            };
            tabControl1.Items.Add(item);
        }
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var random = new Random();
        var rectangle = new Rectangle()
        {
            Stroke = Brushes.Black,
            Fill = Brushes.SkyBlue,
            Width = 50,
            Height = 75,
            Margin = new Thickness(
                left: random.NextDouble() * 300,
                top: random.NextDouble() * 150,
                right: 0,
                bottom: 0),
            HorizontalAlignment = HorizontalAlignment.Left,
            VerticalAlignment = VerticalAlignment.Top,
        };
        var grid = (Grid)tabControl1.SelectedContent;
        grid.Children.Add(rectangle);
    }
}

答案 1 :(得分:3)

你应该看一下约什史密斯的这篇文章 -

Patterns - WPF Apps With The Model-View-ViewModel Design Pattern

这是解释MVVM实现的最佳文章之一,开发的示例应用程序在运行时创建选项卡,并使用模板显示内部内容。如果你可以采用相同的方式,那么你将拥有一个非常稳定和可扩展的应用程序。

注意:可从MSDN Code Gallery

下载代码

答案 2 :(得分:2)

如果这只是添加一些控件,或在Tab上绘制一些东西,因为它不是很清楚,我个人强烈建议定义 TabItem的模板 XAML 中,因为它会为您节省很多“绘图修正”时间。如果你有一个 Blender ,它将变得更加容易。

编辑

如果你需要一些带有绑定的样本,那么现在我手上没有代码,但是可以为你提供一个开源项目的链接。看看TabItems是如何在那里管理的。

SvnRadar

问候。