Приложение с несколькими вкладками (C #) - PullRequest
1 голос
/ 17 ноября 2009

Я создаю .NET-приложение с несколькими вкладками, которое позволяет пользователю динамически добавлять и удалять вкладки во время выполнения. Когда добавляется новая вкладка, к ней добавляется элемент управления (как дочерний элемент), в котором содержимое можно редактировать (например, текстовое поле). Пользователь может выполнять задачи в видимом в данный момент текстовом поле, используя панель инструментов / строку меню.

Чтобы лучше объяснить это, посмотрите на рисунок ниже, чтобы увидеть пример того, чего я хочу достичь. Это просто макет, так что на самом деле это не работает, но показывает, что я хочу сделать. По сути, как блокнот с несколькими вкладками.

Посмотреть изображение здесь: http://picasion.com/pic15/324b466729e42a74b9632c1473355d3b.gif

Возможно ли это в .NET? Я уверен, что это так, я просто ищу способ, которым это можно реализовать.

Ответы [ 3 ]

0 голосов
/ 17 ноября 2009

Я попробовал это для удовольствия ... Я создал форму с помощью ToolStripContainer и ToolStrip внутри него со стандартными кнопками (включая кнопку вставки). Я переименовал кнопку вставки в pasteButton и подключил все, что вы получили:

public Form2()
    {
        InitializeComponent();

        TabControl tc = new TabControl();
        toolStripContainer1.ContentPanel.Controls.Add(tc);
        tc.Dock = DockStyle.Fill;

        TextBox selectedTextBox = null;

        pasteButton.Click += (_, __) => selectedTextBox.Paste(Clipboard.GetText(TextDataFormat.Text));

        int pages = 0;

        newTabButton.Click += (_,__) => {                
            TextBox tb = new TextBox { Multiline = true, Dock = DockStyle.Fill, ScrollBars = ScrollBars.Vertical };
            TabPage tp = new TabPage("Page " + (++pages).ToString());                
            tc.Selected += (o, e) => selectedTextBox = e.TabPage == tp ? tb: selectedTextBox;
            tp.Controls.Add(tb);
            tc.TabPages.Add(tp);
            tc.SelectedTab = tp;
            selectedTextBox = tb;
        };           

    }
0 голосов
/ 17 ноября 2009

Вы можете использовать простой метод расширения:

    public static void PasteIntoCurrentTab(this TabControl tabControl)
    {
        if (tabControl.SelectedTab == null)
        {
            // Could throw here.
            return;
        }

        if (tabControl.SelectedTab.Controls.Count == 0)
        {
            // Could throw here.
            return;
        }

        RichTextBox textBox = tabControl.SelectedTab.Controls[0] as RichTextBox;
        if (textBox == null)
        {
            // Could throw here.
            return;
        }

        textBox.Paste();                    
    }

Использование:

myTabControl.PasteIntoCurrentTab();
0 голосов
/ 17 ноября 2009

Я предлагаю вам обновлять некоторые переменные «текущего состояния», чтобы у вас всегда был указатель на выбранную вкладку и ее дочерний элемент управления (в случае обсуждаемой здесь эмуляции с вкладками и блокнота: TextBox). Я предпочел бы отслеживать соединения TabPage <> TextBox с использованием словаря, чтобы избежать необходимости приведения TextBox, если к ним обращаются по маршруту TabPage.Controls: следующий код предполагает, что у вас есть TabControl с именем 'tabControl1 в форме:

Dictionary<TabPage, TextBox> dct_TabPageToTextBox;

int tabCnt = 1;

TabPage currentTabPage;

TextBox currentTextBox;

Итак, когда вы создаете каждую новую вкладку во время выполнения, вы вызываете что-то вроде этого:

    private void AddNewTabPage()
    {
        if (dct_TabPageToTextBox == null) dct_TabPageToTextBox = new Dictionary<TabPage, TextBox>();

        currentTabPage = new TabPage("Page " + tabCnt.ToString());
        tabControl1.TabPages.Add(currentTabPage);

        currentTextBox = new TextBox();

        dct_TabPageToTextBox.Add(currentTabPage, currentTextBox);

        currentTabPage.Controls.Add(currentTextBox);
        currentTextBox.Dock = DockStyle.Fill;

        currentTextBox.Text = "sample text for page " + tabCnt.ToString();

        tabControl1.SelectedTab = currentTabPage;
        tabCnt++;
    }

Когда конечный пользователь меняет выбранную вкладку, вы можете просто обновить текущие переменные состояния следующим образом:

private void tabControl1_SelectedIndexChanged(object sender, EventArgs e)
{
    currentTabPage = tabControl1.SelectedTab;
    currentTextBox = dct_TabPageToTextBox[currentTabPage];

    MessageBox.Show("text in current Tab Page is : " + currentTextBox.Text);
}

Итак, теперь код, который вызывается вашими пунктами меню, применяется только к currentTextBox.

лучший, Билл

...