【问题标题】:Windows Phone 7: reference page controls in thread-safe wayWindows Phone 7:以线程安全的方式引用页面控件
【发布时间】:2012-03-09 18:13:48
【问题描述】:

这就是我想要做的。在我的 WP7 应用程序中,我正在加载一个包含两个 StackPanel 的页面。 StackPanel1 为“折叠”,StackPanel2 为“可见”。在加载页面时,我启动了一个 HttpWebRequest,然后异步处理 BeginGetResponse。此时我只想交换两个 StackPanel 的 Visibility。但是,由于 BeginGetResponse 是异步运行的,因此我不再处于 UI 线程中并且无法操作这些 StackPanel 控件。如果我尝试引用它们,当然,我会得到“非静态字段、方法或属性 'blah.StackPanel1' 需要对象引用”

这一切都说得通,我明白了。

以下是我尝试过的一些方法:

  1. 代表,但无论如何我都需要对我的控件进行静态引用。失败。
  2. 我尝试创建对我的页面类的静态引用,然后使用它来引用 BeginGetResponse 中的控件。这已编译,但我得到了 UnauthorizedAccessException 'invalid cross-thread access'。在运行时,当我尝试引用控件时。
  3. 搜索再搜索再搜索。
  4. 使用 Deployment.Current.Dispatcher.BeginInvoke 在 UI 线程上运行。

如何静态引用这些控件?

或者有没有更好的方法来做我正在做的事情?

编辑:

这是我的 HttpWebRequest

if (NetworkInterface.GetIsNetworkAvailable())
        {
            HttpWebRequest httpWebRequest = HttpWebRequest.CreateHttp("http://urlThatWorks.com");
            httpWebRequest.Method = "GET";
            httpWebRequest.BeginGetResponse((asyncresult) =>
                //do processing of my return here

                //then here is the problem
                StackPanel1.Visibility = System.Windows.Visibility.Visible;
                StackPanel2.Visibility = System.Windows.Visibility.Collapsed;

           }, httpWebRequest);

        }

另一个编辑:

这是我尝试使用 Deployment.Current.Dispatcher.BeginInvoke 的方法

  httpWebRequest.BeginGetResponse((asyncresult) =>
      //do processing of my return here

      Deployment.Current.Dispatcher.BeginInvoke(() =>
          {
              StackPanel1.Visibility = System.Windows.Visibility.Visible;
              StackPanel2.Visibility = System.Windows.Visibility.Collapsed;
          });
  }, httpWebRequest);

【问题讨论】:

  • 请显示一些代码,我想我知道你的问题,但我不能确定。尽可能显示所有相关代码。

标签: windows-phone-7 reference static


【解决方案1】:

您并不真正想要静态引用,您需要一种线程安全的方式来访问它们。
您可以通过以下方式在 UI 线程上执行它:

Deployment.Current.Dispatcher.BeginInvoke(()=> SomeMethod);

Deployment.Current.Dispatcher.BeginInvoke(()=> {  // code });

【讨论】:

  • 我实际上是在几分钟前发现的。 stackoverflow.com/questions/4679324/… 我试图让它工作,但不能。我仍然得到“非静态字段需要对象引用......”我将编辑我的问题以包含这个。
  • 您的异步进程是在您的页面中定义的,还是在外部定义的(例如单独的类、视图模型等)?
  • 好吧,我创建了一个新页面,其中只有 webrequest 和显示/隐藏,它可以工作。所以,不知何故,我在页面上做的其他事情让我很困惑。但是我使用的方法是你的。感谢您的帮助,这个周末我将不得不深入研究页面的其余部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多