【问题标题】:How to refresh a window in C#/WPF?如何在 C#/WPF 中刷新窗口?
【发布时间】:2015-01-08 09:36:17
【问题描述】:

我想根据一个事件改变一个值(textBlock)。然后,我想刷新我的窗口,但我不能。我使用了 invalidateVisual 以及其他帖子的解决方案,但没有任何效果。

提前谢谢你

【问题讨论】:

  • 为什么需要“刷新”窗口?这个要求告诉我你做的非常非常错误。而且;你怎么知道它不起作用?
  • 我正在尝试创建一个议程,我想在单击后显示联系人的信息。更具体地说,我在窗口的左侧有一个联系人列表,当其中一个项目时,我将在右侧显示适当的信息。
  • 这是一个绑定好吧;你不需要InvalidateVisual 或类似的。
  • 您需要显示代码。通常,更改TextBlockText 属性(或任何其他影响其视觉状态的属性)将自动导致元素被重绘。如果这没有发生,那么您的代码会以某种方式干扰该过程。但是如果没有一个好的代码示例,没有人可以告诉你哪里出了问题。见stackoverflow.com/help/mcve

标签: c# wpf window refresh textblock


【解决方案1】:

几个解决方案(第一个和第二个不使用数据绑定)。

 txtMyControl.text = "New value";

如果不在主线程上,您可以使用调度程序来更新值。

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

然而,最友好的 WPF 方法是使用数据绑定。 对代码中的值所做的任何更改都会立即反映在 UI 中。

XAML

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

在您的代码中,您必须声明一个持久的变量。

private ExampleModel _ExampleModel = new ExmampleModel();

当您加载代码时,将该变量与您的文本框数据上下文相关联。

txtExample.DataContext = _ExampleModel 

然后,您将拥有一个包含屏幕上所有可编辑属性(文本框、单选框等)的类

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);
}

每当您处理您的事件时,您只需更改包含信息的属性的值,UI 就会相应地刷新。此外,由于我们使用双向绑定,因此您的文本框中的值将始终与 ExampleModel 类中 MyTextProperty 属性包含的值相同,这使得值检索非常容易。
例如:

_ExampleModel.MyTextProperty = "New value";

如果您已经在使用数据绑定,请确保使用的类实现了 INotifyPropertyChanged,并且在属性值更改时调用 propertyChanged 事件,否则它不会更新 UI。

【讨论】:

    【解决方案2】:

    如果您的事件更新了文本块,并且您正在使用的文本块绑定到一个字符串属性,并且该属性在其 set 方法中发出 NotifyPropertyChanged(),这将导致显示按照您的需要刷新。

    还有其他方法,但鉴于我对您问题的理解,这是最简单的方法。

    (这与其他答案类似,但我试图用词来表达,以便更容易理解/实施。)

    【讨论】:

      【解决方案3】:

      您尝试做的最佳方法是使用数据绑定。

      您需要有一个字符串对象,该对象将始终保存您的文本块的值。接下来,您需要将该对象绑定到您的文本块,然后使用INotifyPropertyChanged 接口提供的事件,每次值更改时,其表示(文本块)将更改为,无需刷新窗口。

      更多信息here

      【讨论】:

      • 这并不能真正回答不存在的问题。不过这是个好建议。
      • 现在开始 C#/WPF 能不能再客气点,对人表示尊重?
      • @Vasileios但这篇文章似乎很有礼貌和尊重。我的评论是针对 OP 的(您仍然并没有真正提出问题;您在评论中确实做了,但应该编辑这些细节)。老实说,我也看不出我的评论是多么粗鲁/不尊重。不过,请务必接受两个答案中的建议。
      猜你喜欢
      • 2011-06-22
      • 2010-10-29
      • 2011-03-30
      • 2010-11-03
      • 2012-12-20
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      相关资源
      最近更新 更多