Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可关闭选项卡项。如何添加文本框?_C#_Wpf_Multithreading_Textbox - Fatal编程技术网

C# 可关闭选项卡项。如何添加文本框?

C# 可关闭选项卡项。如何添加文本框?,c#,wpf,multithreading,textbox,C#,Wpf,Multithreading,Textbox,我正在处理一个多线程应用程序,每个新线程都会打开一个新的“可关闭”选项卡。我从中获得了可关闭tabitems的代码,但我还希望在tabitem中有一个文本框。我厌倦了在运行时从main方法添加textbox,但无法从之后创建的线程访问它。什么是最好的方式使这项工作?我正在寻找最好的方法,将文本框添加到可关闭的选项卡中,我可以从其他工作线程编辑这些选项卡 编辑: 我已经添加了一些示例代码来展示我试图实现的目标 namespace SampleTabControl { public partia

我正在处理一个多线程应用程序,每个新线程都会打开一个新的“可关闭”选项卡。我从中获得了可关闭tabitems的代码,但我还希望在tabitem中有一个文本框。我厌倦了在运行时从main方法添加textbox,但无法从之后创建的线程访问它。什么是最好的方式使这项工作?我正在寻找最好的方法,将文本框添加到可关闭的选项卡中,我可以从其他工作线程编辑这些选项卡

编辑: 我已经添加了一些示例代码来展示我试图实现的目标

namespace SampleTabControl
{
  public partial class Window1 : Window
  {
    public static Window1 myWindow1;

    public Window1()
    {
      myWindow1 = this;
      InitializeComponent();
      this.AddHandler(CloseableTabItem.CloseTabEvent, new RoutedEventHandler(this.CloseTab));      
    }

    private void CloseTab(object source, RoutedEventArgs args)
    {
      TabItem tabItem = args.Source as TabItem;
      if (tabItem != null)
      {
        TabControl tabControl = tabItem.Parent as TabControl;
        if (tabControl != null)
          tabControl.Items.Remove(tabItem);
      }
    }

    private void btnAdd_Click(object sender, RoutedEventArgs e)
    {
      Worker worker = new Worker();

      Thread[] threads = new Thread[1];
      for (int i = 0; i < 1; i++)
      {
        TextBox statusBox = new TextBox();

        CloseableTabItem tabItem = new CloseableTabItem();
        tabItem.Content = statusBox;
        MainTab.Items.Add(tabItem);

        int index = i;
        threads[i] = new Thread(new ParameterizedThreadStart(worker.start));
        threads[i].IsBackground = true;
        threads[i].Start(tabItem);
      }     
    }
  }
}
在我注释掉的行中,statusBox不可访问


致以最良好的祝愿

看到你的编辑后,我原来的帖子显然没有回答原来的问题

我认为要以您想要的方式访问文本框,您需要将tabItem.Content转换为文本框

像下面这样的方法可以奏效

TextBox t = tabItem.Content as TextBox;
if (t != null)
    Window1.myWindow1.Dispatcher.BeginInvoke((Action)(() => { t.Text = "THIS IS THE TEXT";}), System.Windows.Threading.DispatcherPriority.Normal);

WPF无法修改在与当前线程不同的线程上创建的项目

如果您还没有,我强烈建议您研究MVVM设计模式。这将UI层与业务逻辑层分离。您的应用程序将成为您的
ViewModel
类,UI层(视图)只是一个漂亮的界面,允许用户轻松地与ViewModels交互

这意味着您的所有UI组件都将共享一个线程,而您运行时间较长的进程(如检索数据或处理数字)都可以安全地在后台线程上完成

例如,您可以将
TabControl.ItemsSource
绑定到
observeCollection
,当您执行
AddTabCommand
时,您将启动一个新的后台工作程序,向
MainViewModel.TabViewModels
集合添加一个新的
TabViewModel


后台工作人员完成工作后。UI会自动通知集合中有一个新项,并将使用您指定的任何数据模板在
TabControl
中为您绘制新的
TabItem

是的,我知道调度程序,但当我在运行时将文本框添加到可关闭选项卡时,它将无法访问。我将添加一些示例代码,以便您可以看到。“TextBox t=tabItem.Content as TextBox;”使程序在运行时崩溃。我刚刚检查了错误消息,它说“调用线程无法访问此对象,因为它是其他线程拥有的。”您能告诉我如何修复它吗?
TextBox t = tabItem.Content as TextBox;
if (t != null)
    Window1.myWindow1.Dispatcher.BeginInvoke((Action)(() => { t.Text = "THIS IS THE TEXT";}), System.Windows.Threading.DispatcherPriority.Normal);