何时使用自定义/用户控件或模板/样式

时间:2011-03-28 13:24:04

标签: wpf user-controls

我正在创建一个记录器应用程序来学习WPF,每当有一些监听器收到新消息时,我希望新的消息出现在scrollviewer的底部。我希望每条消息都能创建如下所示的内容:

==================================
= Source | Message               =
=        |                       =
=        |                       =
==================================

我这里有2本WPF书籍,他们都有“警告”说在大多数情况下还有其他比自定义/用户控件更简单,更好的机制。我想知道是否可以使用控件模板解决这个问题,如果是这样,我应该使用哪种控件类型作为基础?

2 个答案:

答案 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>

参考:How to: Display ListView Contents by Using a GridView