Я думаю, что вы действительно хотите сделать Task.Run
, но с помощью специального планировщика. StartNew
не работает интуитивно с асинхронными методами; Стивен Тууб имеет отличное сообщение в блоге о различиях между Task.Run
и TaskFactory.StartNew
.
Итак, чтобы создать свой собственный Run
, вы можете сделать что-то вроде этого :
private static readonly TaskFactory myTaskFactory = new TaskFactory(
CancellationToken.None, TaskCreationOptions.DenyChildAttach,
TaskContinuationOptions.None, new MyTaskScheduler());
private static Task RunOnMyScheduler(Func func)
{
return myTaskFactory.StartNew(func).Unwrap();
}
private static Task RunOnMyScheduler(Func> func)
{
return myTaskFactory.StartNew(func).Unwrap();
}
private static Task RunOnMyScheduler(Action func)
{
return myTaskFactory.StartNew(func);
}
private static Task RunOnMyScheduler(Func func)
{
return myTaskFactory.StartNew(func);
}
Затем вы можете выполнить синхронные асинхронные методы или в своем настраиваемом планировщике.
Кнопка WPF (или ToggleButton) — это элемент управления содержимым, в который можно поместить что угодно.
Я не проверял, но эти кнопки, вероятно, имеют горизонтальную панель стека или DockPanel, с изображением, а затем один или два TextBlocks. Для них можно создать шаблон, а также использовать привязку для задания содержимого TextBlock Text из модели представления.
Snoop ( http://snoopwpf.codeplex.com/ ) - отличный инструмент для выяснения того, как другие люди создали вещи в WPF.
Книга Адама Натана WPF превосходна, и если у вас ее нет, вы должны ее получить. http://www.amazon.co.uk/Windows-Presentation-Foundation-Unleashed-WPF/dp/0672328917
Вот пример:
<ToggleButton Height="24" Width="100">
<DockPanel>
<Image Source="c:\\temp\\me.jpg" Margin="3"/>
<TextBlock Text="20 Errors"/>
</DockPanel>
</ToggleButton>