我正在用 C# 构建一个小型 wpf 应用程序。当单击按钮时,第三方 dll 函数会构造一个树状对象。此对象绑定到树视图。这工作正常,但需要一些时间来加载。当 dll 函数构造对象时,它将进度信息打印到控制台。我想将此重定向到 TextBlock 以便用户看到进度消息。
我的窗口 ctor 看起来像这样:
初始化组件(); StringRedir s = new StringRedir(ref ProgressTextBlock); Console.SetOut(s); Console.SetError(s); this.DataContext = s;
xml:
<
TextBlock 文本="{绑定路径=文本}" 宽度="244" x:Name="ProgressTextBlock" TextWrapping="Wrap" /><
树视图 >...<
/树视图 >
StringRedir 类如下所示。问题是 TextBlock 出于某种原因在加载 TreeView 之前不会更新消息。单步执行我看到 Text 属性正在更新,但 TextBlock 没有得到刷新。我在 Text 被更新的地方添加了一个 MessageBox.Show () ,这似乎导致窗口每次都刷新并且我能够看到每条消息。所以我想我需要一些方法来显式刷新屏幕......但这没有意义我认为当属性更改时数据绑定会导致视觉刷新。我在这里想念什么?如何让它刷新?任何建议表示赞赏!
public class StringRedir : StringWriter , INotifyPropertyChanged
{
private string text;
private TextBlock local;
public string Text {
get{ return text;}
set{
text = text + value;
OnPropertyChanged("Text");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
public StringRedir(ref TextBlock t)
{
local = t;
Text = "";
}
public override void WriteLine(string x)
{
Text = x +"\n";
//MessageBox.Show("hello");
}
}