WPF tabcontrol以编程方式更改C#中显示的选项卡数,名称和信息

时间:2014-06-06 13:19:55

标签: c# wpf tabcontrol

我正在开发一个解析日志文件并将其组织起来以便于查看和修复错误的程序。日志中包含的一个数据是通道数据,它显示网络中报告来自哪台计算机。我想在tabcontrol窗口中显示已解析的日志,其中每个通道都显示在单独的选项卡中。

问题是给定系统中的标签数量(这些是天文馆)的范围是4-64,所以不是创建64个标签而且大部分时间只填充其中一些,我希望, C#后台代码,以编程方式查看日志,为每个出现的新频道创建一个选项卡,并将该​​日志添加到该选项卡文本中。本质上代码看起来应该是这样的:

public void fillTabs()
{
    tabViewWindow win = new tabViewWindow;
    Dictionary<string,string> logs = new Dictionary<string,string>();
    foreach(var log in infoLogParser.parsedLogs)
    {
        if(logs["Channel "+log.data[2]].Exists())
        {
            logs[tab.name].Add(log.data[4] + "\n");
        }
        else
        {
            win.tabviewer.addtab();
            tab.name = "Channel " +log.data[2];
            logs.Add("channel " + log.data[2], log.data[4] + "\n");
        }
     }
 }

然后从那里添加代码从列表添加到选项卡。但我无法弄清楚如何在TabControl中实际创建标签。

我总是伪造添加这个但是我在.net 3.5中工作,所以该程序可以在XP系统上使用

2 个答案:

答案 0 :(得分:2)

因此,我将首先为Channel

创建数据类
    public class Channel
    {
        public Channel()
        {
            Log = new List<string>();
        }

        public string Name { get; set; }
        public List<string> Log { get; set; }
    }

然后我将声明另一个将成为视图的DataContext的类,或者你可以说Window

使用ObservableCollection类型的属性来帮助我进行绑定 和预期的功能

    class MainViewModel
    {
        public MainViewModel()
        {
            Channels = new ObservableCollection<Channel>();
        }

        public ObservableCollection<Channel> Channels { get; set; }

        public void fillTabs()
        {
            foreach (var log in infoLogParser.parsedLogs)
            {
                Channel ch = Channels.FirstOrDefault(c => c.Name = "Channel " + log.data[2]);
                if (ch == null)
                {
                    ch = new Channel();
                    ch.Name = "Channel " + log.data[2];
                    Channels.Add(ch);
                }
                ch.Log.Add(log.data[4] + "\n");
            }
        }
    }

另外我修改了函数以使用新方法

现在我将此类的实例设置为视图或我的主窗口的构造函数,有很多方法可以分配,这只是一个简单的方法。

    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainViewModel();
    }

然后在WPF XAML中我将标签控件的ItemSource绑定到我的集合,并将为标题和内容创建数据窗口

    <TabControl ItemsSource="{Binding Channels}" >
        <TabControl.Resources>
            <Style TargetType="TabItem">
                <Setter Property="Header" Value="{Binding Name}" />
            </Style>
        </TabControl.Resources>
        <TabControl.ContentTemplate>
            <DataTemplate>
                <ListBox ItemsSource="{Binding Log}"/>
            </DataTemplate>
        </TabControl.ContentTemplate>
    </TabControl>

您完成了简单的绑定,它会将您的频道显示为标签控件中的标签项

现在tab控件将对集合属性Channels中的更改做出反应,如果添加一个通道,它将被添加到tabcontrol,同样具有删除和重新排序,你只需要从代码中操作集合,你就不需要触摸UI元素。

答案 1 :(得分:0)

您可以在后面的代码中将TabItem添加到TabControl,如下所示:

TabControl tc = new TabControl();
TabItem ti = new TabItem();
tc.Items.Add(ti);