私はC#で小さなwpfアプリを構築しています。ボタンがクリックされると、サードパーティのdll関数がオブジェクトのようなツリーを構築します。このオブジェクトはツリービューにバインドされています。これは正常に機能しますが、ロードには少し時間がかかります。dll関数がオブジェクトを作成すると、進行状況情報がコンソールに出力されます。これをTextBlockにリダイレクトして、ユーザーが進行状況メッセージを表示できるようにします。
私のウィンドウコンストラクタは次のようになります。
InitializeComponent(); StringRedir s = new StringRedir(ref ProgressTextBlock); Console.SetOut(s); Console.SetError(s); this.DataContext = s;
xaml:
<
TextBlock Text = "{Binding Path = Text}" Width = "244" x:Name = "ProgressTextBlock" TextWrapping = "Wrap" /><
TreeView> ...<
/ TreeView>
StringRedirクラスを以下に示します。問題は、TreeViewがロードされるまで、何らかの理由でTextBlockがメッセージで更新されないことです。ステップスルーすると、Textプロパティが更新されているのがわかりますが、TextBlockが更新されていません。テキストが更新される時点で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");
}
}