Изменить метку на странице из другого окна C# wpf

Я сделал приложение с NavigationWindow с загруженной в него страницей. Также есть еще одно (обычное) окно в этом проекте. Имена этих окон/страниц:

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

У меня есть ярлык на странице 1, и я хочу изменить его с 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();     
        }

Я искал Google, чтобы найти решение, но я не понимаю. Я думаю, это как-то связано с Dispatcher?!

Я действительно новичок в C#, VS10express и WPF.

Как изменить label4 в TwitterConnect? Не могли бы вы объяснить это фрагментом кода?


person Lars Boele    schedule 27.05.2011    source источник


Ответы (2)


Вы создаете новый экземпляр Page1.xaml из окна TwitterConnect. Что вам нужно сделать, так это найти способ доступа к текущему экземпляру Page1.xaml, который можно легко получить с помощью свойства DataContext окна Window класс.

Страница1.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.

person aligray    schedule 27.05.2011

Если я правильно понял ваш вопрос, вам нужно обновить элемент управления.

это новый класс

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

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

это пример метода в вашем классе (page1?)

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

проверьте эту ссылку

person Coder323    schedule 27.05.2011