Следующий код демонстрирует мою дилемму. Код создает фоновый поток, который что-то обрабатывает, а затем вызывает поток пользовательского интерфейса с результатом.
Он может вызвать исключение, если фоновый поток вызывает Invoke в форме после закрытия формы. Он проверяет IsHandleCreated перед вызовом Invoke, но форма может закрыться после проверки.
void MyMethod()
{
// Define background thread
Action action = new Action(
() =>
{
// Process something
var data = BackgroundProcess();
// Try to ensure the form still exists and hope
// that doesn't change before Invoke is called
if (!IsHandleCreated)
return;
// Send data to UI thread for processing
Invoke(new MethodInvoker(
() =>
{
UpdateUI(data);
}));
});
// Queue background thread for execution
action.BeginInvoke();
}
Одним из решений может быть синхронизация FormClosing и каждого вызова Invoke, но это звучит не очень элегантно. По умолчанию я имею в виду стиль, который мы используем с помощью blend.
Как сделать ориентацию элементов списка горизонтальной в стилизации списка по умолчанию. По умолчанию я имею в виду стиль, который мы используем, используя blend.
Используйте свойство ItemsPanel , чтобы заменить панель горизонтальной StackPanel:
<ListBox>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
Если вы хотите сделать это в стиле, просто добавьте Setter, который устанавливает ItemsPanel недвижимость:
<Style TargetType="ListBox">
<!-- Rest of the style -->
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
</Style>