所以我创建了一个TextBlock,我想记录我的所有消息,但此刻我被卡住了,我一次只发布1条消息并覆盖上一条消息。我目前的代码:
XAML:
<TextBlock Name="LogTextBlock" Foreground="Silver"
Height="480" Width="588" Margin="10,10,0,0"
HorizontalAlignment="Left" VerticalAlignment="Top">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0}">
<Binding Path="LogText" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
代码:
public class StatusLogger : INotifyPropertyChanged
{
private static string _logText;
public string LogText
{
get { return _logText; }
set
{
if (_logText == value) return;
_logText = value;
OnPropertyChanged("LogText");
}
}
public static void WriteLine(string text, params object[] args)
{
_logText = String.Format(text, args);
}
#region Property Change Handler
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
我使用StatusLogger的方式是在我的代码中静态使用它,例如
StatusLogger.WriteLine("{0}: Testing the first message!{1}", DateTime.Now, Environment.NewLine);
StatusLogger.WriteLine("{0}: Testing the second message!{1}", DateTime.Now, Environment.NewLine);
基本上,它一次显示一行,但我希望它显示我添加到其中的每一行的历史记录。我尝试了几种不同的方式,但我现在发布了我目前所拥有的内容。
答案 0 :(得分:4)
问题是WriteLine()
方法会覆盖_logText
中的任何内容,返回值为String.Format()
。因此,您可以有效地用新行替换之前记录的行。
更好的方法可能是使用StringBuilder
,特别是如果您预计会显示很多行:
public class StatusLogger : INotifyPropertyChanged
{
private static StringBuilder _logText = new StringBuilder();
public string LogText
{
get { return _logText.ToString(); }
set
{
_logText = new StringBuilder(value);
OnPropertyChanged("LogText");
}
}
public static void WriteLine(string text, params object[] args)
{
_logText.AppendFormat(text + Environment.NewLine, args);
}
}