2014-11-11 3 views
0

Я хочу изменить значение (textBlock) в соответствии с событием. Затем я хочу обновить свое окно, но не смог. Я использовал invalidateVisual, а также решения других сообщений, но ничего не получилось.Как обновить окно в C#/WPF?

Спасибо заранее

+0

Зачем вам нужно «обновлять» окно? Это требование говорит мне, что вы делаете это очень, очень, * неправильно *. Более того; как вы знаете, что он не работает? – BradleyDotNET

+0

Я пытаюсь создать повестку дня, и я хочу показать информацию для контакта после нажатия на нее. Чтобы быть более конкретным, у меня есть в левой части окна список контактов, и когда элемент из них я покажу соответствующую информацию в правой части. – Vasileios

+0

То есть привязка хорошо; вам не нужно 'InvalidateVisual' или подобное. – BradleyDotNET

ответ

0

Лучший подход к тому, что вы пытаетесь сделать, будет использовать связывание данных.

У вас должен быть строковый объект, который всегда будет хранить значение вашего текстового блока. Затем вам нужно связать этот объект с вашим текстовым блоком, а затем использовать событие, предоставленное интерфейсом INotifyPropertyChanged, и каждый раз, когда значение изменит его представление (текстовый блок) изменится, нет необходимости обновлять окно.

Более подробная информация here

+0

Это не отвечает на несуществующий вопрос. Хороший совет. – BradleyDotNET

+0

Не могли бы вы быть более вежливыми и проявлять уважение к людям, начинающим сейчас C#/WPF? – Vasileios

+0

@ Vasileios Не знаете, к кому вы обращались здесь; но этот пост кажется очень вежливым и почтительным. Мой комментарий был направлен на OP (и вы еще не задали вопрос, вы как-то сделали в своем комментарии, но такие детали должны быть отредактированы). Честно говоря, я не вижу, как мои комментарии были грубыми/неуважительными. Пожалуйста, дайте совет в обоих ответах, хотя. – BradleyDotNET

0

Если событие обновляет TextBlock и TextBlock вы используете привязан к свойства строки и свойство выдает NotifyPropertyChanged() в это набор метод, который будет вызывать дисплей для обновления, как ты желаешь.

Есть и другие способы, но это самое легкое, учитывая мое понимание вашего вопроса.

(это похоже на другой ответ, но я пытался слова так легче понять/реализации.)

3

несколько решений (первый и второй один не использовать привязки данных).

txtMyControl.text = "New value"; 

Если нет основного потока, вы можете использовать диспетчер для обновления значения.

Application.Current.Dispatcher.BeginInvoke(() => txtMyControl.text == "New Value") 

Однако самый удобный способ WPF сделать это - использовать привязку данных. Любое изменение, внесенное в значение в коде, будет немедленно отражено в пользовательском интерфейсе.

XAML

<TextBox x:Name="txtExample" Text="{Binding MyTextProperty,Mode=TwoWay}" Height="24" Width="120"/> 

В вашем коде, вы должны объявить переменную, которая будет упорным.

private ExampleModel _ExampleModel = new ExmampleModel(); 

При загрузке кода вы связываете эту переменную с контекстом данных текстового поля.

txtExample.DataContext = _ExampleModel 

Тогда у вас есть класс, который будет содержать все редактируемые свойства на экране (Textboxes, радио коробки, и т.д ...)

public class ExampleModel : INotifyPropertyChanged 
{ 

private string _MyTextProperty = "test"; 
public string MyTextProperty { 
    get { return _MyTextProperty; } 
    set { 
     if (string.Compare(_MyTextProperty, value) != 0) { 
      _MyTextProperty = value; 
      RaisePropertyChanged("MyTextProperty"); 
     } 
    } 
} 

public void RaisePropertyChanged(string PropertyName) 
{ 
    if (PropertyChanged != null) { 
     PropertyChanged(this, new PropertyChangedEventArgs(PropertyName)); 
    } 
} 

public event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged; 
public delegate void PropertyChangedEventHandler(object sender, PropertyChangedEventArgs e); 
} 

Всякий раз, когда вы регулируете ваше мероприятие, вы просто должны измените значение свойства, содержащего информацию, и пользовательский интерфейс будет соответствующим образом обновляться. Кроме того, поскольку мы используем двустороннюю привязку, значение из вашего текстового поля всегда будет таким же, как значение, содержащееся в свойстве MyTextProperty в классе ExampleModel, что очень упрощает поиск значений.
например:

_ExampleModel.MyTextProperty = "New value"; 

Если вы уже использовали привязки данных, убедитесь, что класс используется инвентарь INotifyPropertyChanged и что это событие PropertyChanged вызывается, когда изменение значения свойства или в противном случае он не будет обновлять пользовательский интерфейс.

 Смежные вопросы

  • Нет связанных вопросов^_^