Когда использовать пользовательский / пользовательский элемент управления или шаблон / стиль - PullRequest
0 голосов
/ 28 марта 2011

Я создаю приложение-регистратор для изучения WPF и хочу, чтобы новые сообщения появлялись в нижней части окна просмотра прокрутки каждый раз, когда какой-либо слушатель получает новое сообщение. Я хочу, чтобы каждое сообщение создавало что-то похожее на это:

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

У меня здесь есть две книги WPF, и у них обеих есть "предупреждения", говорящие о том, что в большинстве случаев существуют другие более простые и лучшие механизмы, чем пользовательские / пользовательские элементы управления. Мне было интересно, если это можно решить с помощью шаблонов элементов управления, и если да, то какой тип элемента управления я должен использовать в качестве базы?

Ответы [ 2 ]

1 голос
/ 29 марта 2011

Возможно, 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>

Если по какой-то причине вы хотите динамически изменять текст записей журнала, вам потребуется реализовать интерфейс INotifyPropertyChanged в классе LogEntry, чтобы обновить представление списка.

0 голосов
/ 28 марта 2011

Попробуйте использовать ListView и установить для его вида значение GridView.

<ListView>
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Source" Width="120" />
            <GridViewColumn Header="Message" Width="400" />
        </GridView>
    </ListView.View>
</ListView>

См. Как отобразить содержимое ListView с помощью GridView

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...