我正在创建一个记录器应用程序来学习WPF,每当有一些监听器收到新消息时,我希望新的消息出现在scrollviewer的底部。我希望每条消息都能创建如下所示的内容:
==================================
= Source | Message =
= | =
= | =
==================================
我这里有2本WPF书籍,他们都有“警告”说在大多数情况下还有其他比自定义/用户控件更简单,更好的机制。我想知道是否可以使用控件模板解决这个问题,如果是这样,我应该使用哪种控件类型作为基础?
答案 0 :(得分:1)
也许Binding可以提供帮助。 (如果你还在学习WPF,那可能会让事情变得复杂。)
通过绑定,我们可以使ListView
只是您日志记录的可见表示,这意味着添加/删除日志的逻辑可以完全与ListView
分开。
class LogEntry
{
public string Source { get; set; }
public string Message { get; set; }
public LogEntry(string source, string message)
{
Source = source;
Message = message;
}
}
class Listener
{
private int m_maxLogs = 10;
private ObservableCollection<LogEntry> m_logEntries;
public ObservableCollection<LogEntry> LogEntries { get { return m_logEntries; } }
public Listener()
{
m_logEntries = new ObservableCollection<LogEntry>();
}
public void AddLogEntry(string source, string message)
{
if (LogEntries.Count >= m_maxLogs)
{
//Remove the oldest LogEntry.
LogEntries.RemoveAt(0);
}
LogEntries.Add(new LogEntry(source, message));
}
}
如果datacontext设置为Listener实例,则xaml变为(基于之前的答案):
<ListView ItemsSource="{Binding LogEntries}">
<ListView.View>
<GridView>
<GridViewColumn Header="Source" Width="120" DisplayMemberBinding="{Binding Source}"/>
<GridViewColumn Header="Message" Width="400" DisplayMemberBinding="{Binding Message}"/>
</GridView>
</ListView.View>
</ListView>
如果由于某种原因想要动态更改日志条目的文本,则需要在LogEntry类中实现INotifyPropertyChanged
接口以更新listview。
答案 1 :(得分:0)
尝试使用ListView
并将其视图设为GridView
。
<ListView>
<ListView.View>
<GridView>
<GridViewColumn Header="Source" Width="120" />
<GridViewColumn Header="Message" Width="400" />
</GridView>
</ListView.View>
</ListView>