从另一个窗口C#wpf更改页面上的标签

时间:2011-05-27 09:02:11

标签: c# wpf dispatcher

我用一个带有页面的NavigationWindow创建了一个应用程序。也是这个项目中的另一个(普通)窗口。 这些窗口/页面的名称:

NavigationWindows: MainWindows
Page: Page1
Window: TwitterConnect
Label on Page: label4

我的Page1上有一个标签,我想从TwitterConnect更改它。 因为我创建了一个新的Page1实例来调用方法ConnectToTwitter(),所以我页面上的标签不会更新。 这是TwitterConnect的代码隐藏中的代码:

        private void button1_Click(object sender, RoutedEventArgs e)
        {  
            string pin = twitpin.Text;    

            Page1 page = new Page1();

            page.ConnectToTwitter(pin, genratedToken);

            this.Close();     
        }

我搜索谷歌寻找解决方案,但我没有得到它。 我认为它与Dispatcher有关?!

我真的是C#,VS10express和WPF的初学者。

如何从TwitterConnect更改label4? 你能用一段代码解释一下吗?

2 个答案:

答案 0 :(得分:4)

您正在从 TwitterConnect 窗口创建 Page1.xaml 的新实例。您需要做的是找到一种方法来访问 Page1.xaml 的当前实例,这可以通过使用 Window的 DataContext 属性轻松实现 em> class。

<强> Page1.xaml.cs

private void Page_Loaded(object sender, RoutedEventArgs e)
{
    TwitterConnect twitterWindow = new TwitterConnect();
    // this gives TwitterConnect access to Page1's label4 property
    twitterWindow.DataContext = this;
    twitterWindow.Show();
}

<强> TwitterConnect.xaml.cs

private void ButtonClick(object sender, RoutedEventArgs e)
{
    Page1 page1 = (Page1)this.DataContext;

    string pin = twitpin.Text;    
    page1.ConnectToTwitter(pin, genratedToken);
    // Then you can update the label like so:
    page1.Label4.Text = "The text you want to display on the label";
    this.Close();   
}

如果我错过了什么,请告诉我。此外,我强烈反对这种配置,因为它可能成为维持的噩梦。更好的方法可能是在 Page1.cs 上添加方法或属性,以处理 label4 上的文本设置。

答案 1 :(得分:0)

如果我已正确理解您的问题,则需要刷新控件。

  

这是一个新类

public static class ExtensionMethods
{
 private static Action EmptyDelegate = delegate() { };

 public static void Refresh(this UIElement uiElement)
 {
  uiElement.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate);
 }
}
  

这是您班级中的示例方法   (第1页?)

private void LoopingMethod()
{
for (int i = 0; i < 10; i++)
{
  label1.Content = i.ToString();
  label1.Refresh();
  Thread.Sleep(500);
}
}

请查看此link