在静态方法中从MainWindow调用TextBox

时间:2014-05-29 12:22:01

标签: c# wpf static

如果WPF应用程序具有多个控件(TextBox)。

我想做的是在静态方法中调用该文本框:

private static void Transiever(object sender, ReceivedEventArgs e)
    {

            FunkTasterServiceClient client = new FunkTasterServiceClient();

            client.Endpoint.Address = new EndpointAddress(new Uri(HERE I WANT TO CALL THE TEXTBOX (serviceURL.Text),
            client.Endpoint.Address.Identity, client.Endpoint.Address.Headers);

            client.GetReceivedTelegram(e.Telegram.ToString());
    }

但这是不可能的。我试图创建一个新的Mainwindow实例来调用该文本框。但得到了错误:

The calling thread must be STA, because many UI components require this.

如何安全地调用文本框?有人可以帮忙吗?谢谢!

3 个答案:

答案 0 :(得分:0)

 Thread thread = new Thread(() =>
        {                         
            ///Do what you what ever you want here...e.g Invoke the textbox
            System.Windows.Threading.Dispatcher.Run();
        });
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();

答案 1 :(得分:0)

真正不清楚为什么您需要直接访问文本框而不是简单地获取其中的信息。我相信是这样的。

下面是如何从另一个线程获取文本框中的信息。它通过将属性绑定到 viewmodel 并将viewmodel公开为可从静态方法访问的静态来完成;哪个进程可以获取文本框中保存的当前数据。

按照以下步骤访问文本框中的ServiceUrl信息。

  1. 使用ServiceUrl的字符串属性创建一个ViewModel,该属性遵循INotifyPropetyChanged并在主页上实例化它。
  2. 将文本框文本属性绑定到ServiceUrl作为双向绑定。
  3. 在包含Transiever调用的类上,创建对步骤1中使用的ViewModel类的static属性引用。
  4. 在适当的时候(例如在创建VM的初始实例之后)加载在步骤3中创建的静态属性。
  5. 然后,当静态Transiever运行时,访问静态ViewModel的ServiceUrl属性并根据需要提取数据。

  6. 注意事项

    1. 您的意思是使用名称收发器而不是Transiever 吗?
    2. 如果您需要使用MVVM方法快速进行绑定,请查看我的博客文章Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding以获取帮助。

答案 2 :(得分:0)

我能想到的唯一方法就是创建一个窗口的静态引用,并通过静态窗口引用对象访问TextBox。像这样:

public partial class MyWindow
{    
    public static System.Windows.Window windowRef;

    public MyWindow()
    {
        InitializeComponent();
        Initialize();
    }

    private void Initialize()
    {
        windowRef = this;
    }

    private static void Transiever(object sender, ReceivedEventArgs e)
    {
        FunkTasterServiceClient client = new FunkTasterServiceClient();

        client.Endpoint.Address = 
            new EndpointAddress(new Uri((windowRef.serviceURL.Text),
        client.Endpoint.Address.Identity, client.Endpoint.Address.Headers);

        client.GetReceivedTelegram(e.Telegram.ToString());
    }    
}

我没试过,但我认为这应该有效。如果没有,请告诉我。