Посмотрев на свой код, дайте краткое описание того, что я буду делать:
Удалите обработчик ProgressChanged
. Он предназначен для представления текущего статуса пользователю, которого вы не делаете. Вместо этого вызовите Items.Add
в обработчик DoWork
.
Создайте EventLog
один раз. Это кажется более приятным и экономит вас от потенциального создания его в цикле, если вы не будете осторожны.
Вместо синтаксического анализа текста с регулярным выражением создайте специальный класс. Это действительно важно и сэкономит вам много боли, когда вам нужно более точное поведение или вообще не хотите показывать индекс. Регулярные выражения медленны, и данные, предназначенные для отображения пользователю, никогда не должны анализироваться. Вы должны использовать классы.
Используйте значащие имена. Я знаю, что вы не очистили код, но если вы хотите, чтобы кто-то помог вам через Интернет, вам действительно нужно.
Наконец, получите элемент по индексу. Если вы посмотрели на документацию , вы заметили бы , есть свойство индексатора, которое получает элемент напрямую по его индексу.
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;
}