Посмотрев на ваш код, вот краткая сводка того, что я хотел бы сделать:
Удалить обработчик ProgressChanged
. Он предназначен для сообщения о текущем статусе пользователю, который вы надеваетене делайВместо этого вызовите Items.Add
в обработчике DoWork
.
Создайте EventLog
один раз. Это только кажется более приятным и избавляет вас от потенциального создания его в цикле, если вы не будете осторожны.
Вместо анализа текста с помощью регулярных выражений создайте специальный класс. Это действительно важно и избавит вас от боли, когда вам нужно более точное поведение илине хочу отображать индекс вообще.Регулярные выражения являются медленными, и данные, предназначенные для отображения пользователю, никогда не должны анализироваться.Вы должны использовать классы.
Использовать осмысленные имена. Я знаю, что вы не очистили код, но если вы хотите, чтобы кто-то помог вам через Интернет, вы действительноshould.
Наконец, получите элемент по индексу. Если вы заглянули в документацию , вы бы заметили , есть свойство индексатора, которое получаетэлемент непосредственно по его индексу.
class EntryItem {
public EntryItem (EventLogEntry entry)
{
EntryIndex = entry.Index;
ItemText = string.Format ("{0} - {1} - {2} - {3}",
entry.Index,
entry.EntryType,
entry.TimeWritten,
entry.Source);
}
public string ItemText { get; private set; }
public int EntryIndex { get; private set; }
public override string ToString ()
{
return ItemText;
}
}
private EventLog log = new EventLog {
Log = "System"
};
private void eventLoader_DoWork (object sender, DoWorkEventArgs e)
{
foreach (EventLogEntry entry in this.log.Entries)
this.Dispatcher.BeginInvoke (() => eventListBox.Items.Add (new EntryItem (entry)));
}
private void eventListBox_SelectionChanged (object sender, SelectionChangedEventArgs e)
{
EntryItem item = eventListBox.SelectedItem as EntryItem;
if (item == null)
return;
var entry = log.Entries [item.EntryIndex];
currentEntryLabel.Content = entry.Message;
}