繁体   English   中英

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

[英]WPF tabcontrol programatically changing the # of tabs, their name, and information displayed in C#

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

问题是给定系统(这些是天文馆)中的选项卡数量范围为4-64,因此,我希望在C#背景中创建64个选项卡,而不是创建64个选项卡,并且大多数时候只填充其中的几个代码,以编程方式查看日志,为出现的每个新频道创建一个标签,并将该日志添加到该标签文本中。 本质上,代码应如下所示:

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系统上可用

因此,我将从为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中,并将其添加到TabControl中,并且与删除和重新排序相同,则只需从代码中操作集合即可,而无需触摸UI元素完全没有

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM