2009-11-17 5 views
1

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

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

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

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

ответ

0

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

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

Я использовал только строку 15 вашего кода, то, что мне было нужно, - tabControl.SelectedTab.Controls [0] (получение правильного элемента управления). Работает отлично (на данный момент). Спасибо (вам и остальным). – Zach

0

Да, этот вопрос имеет been answered here, он выглядит так же, как вы просите.

+0

Да у меня есть, что сделано , но я действительно хочу, чтобы элементы на панели инструментов были только с элементом управления на выбранной в данный момент вкладке при нажатии. Вкладка и элемент управления были созданы только во время выполнения. В качестве примера возьмем блокнот из нескольких элементов: я уже понял, как создавать вкладки и добавлять элементы управления во время выполнения, но я хочу, чтобы функция Edit-> Paste работала правильно, т.е. вставьте в текущую выделенную область текста. Надеюсь, я хорошо объяснил. – Zach

0

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

Dictionary<TabPage, TextBox> dct_TabPageToTextBox; 

int tabCnt = 1; 

TabPage currentTabPage; 

TextBox currentTextBox; 

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

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++; 
    } 

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

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); 
} 

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

лучше, Билл

0

Я попробовал это для удовольствия ... Я сделал вид с 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; 
     };   

    }