Просто вызов .Result;
или .Wait()
- это риск блокировок, о котором многие говорили в комментариях. Поскольку большинство из нас, как oneliners, вы можете использовать их для .Net 4.5<
Приобретение значения с помощью метода async:
var result = Task.Run(() => asyncGetValue()).Result;
Синхронно вызывать метод асинхронизации
Task.Run(() => asyncMethod()).Wait();
Никаких проблем с блокировкой не произойдет из-за использования Task.Run
.
Источник:
Можно использовать Кнопку с шаблоном пользовательского элемента управления, код ниже является ограниченной кнопкой стиля гиперссылки (например, это только поддерживает текстовые гиперссылки), но возможно это укажет на Вас в правильном направлении.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<Style x:Key="Link" TargetType="Button">
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Foreground" Value="Blue"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<TextBlock TextDecorations="Underline"
Text="{TemplateBinding Content}"
Background="{TemplateBinding Background}"/>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Foreground" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
<Button Content="Click Me!" Style="{StaticResource Link}"/>
</Page>
Вы не можете добавить гиперссылку в StackPanel - вы получите ошибка выполнения. (На самом деле, я немного удивлен, что это не ошибка времени компиляции.) Это потому, что гиперссылка не находится на стороне «элементов управления» WPF с
и < StackPanel>
и другие элементы, которые размещены на прямоугольных частях экрана и происходят от UIElement
. Вместо этого он живет в "текстовой" стороне вещей, с <жирным>
и
и
и другими текстовыми элементами, которые слово -обтекание и обтекание строк и абзацев и переход от TextElement
.
Как только вы поймете, что есть две отдельные иерархии классов с разным поведением макета, имеет смысл, что гиперссылка будет на стороне «текста» вещей (упрощает, например, наличие абзаца с гиперссылкой посередине и даже для переноса этой гиперссылки через разрыв строки).
Но нет, это не так заметно, когда вы начинаете.
Чтобы смешать два мира, и использовать гиперссылку в качестве элемента управления, все, что вам нужно сделать, это поместить ее в TextBlock. TextBlock - это элемент управления (т. Е. Может входить в StackPanel), который содержит элементы, похожие на текст (т. Е. Может содержать гиперссылку):
<TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock>
Вы можете обнаружить, что если вы привязываетесь к чему-либо, кроме простых текстовых значений, вам нужно будет использовать ContentPresenter
, иначе ничего не появится, это может быть правдой, если вы привязываетесь к источнику данных XML. .
Триггер свойства для IsMouseOver подчеркивает текст.
Пример привязки к XML представлен ниже.
<Style x:Key="JobNumberStyleButton" TargetType="{x:Type Button}">
<Setter Property="VerticalAlignment" Value="Top"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<TextBlock>
<ContentPresenter
Margin="0,0,0,0"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="False"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</TextBlock>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<TextBlock Padding="0,0,0,0" Margin="0,0,0,0">
<Underline>
<ContentPresenter
Margin="0,0,0,0"
ContentTemplate="{TemplateBinding ContentTemplate}"
Content="{TemplateBinding Content}"
ContentStringFormat="{TemplateBinding ContentStringFormat}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="False"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
</Underline>
</TextBlock>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
Обычно, значение Гиперссылки должно дать привязку, чтобы отправить пользователя другому Page или вообще говоря, к другому ресурсу, таким образом, это реализовано таким способом, и необходимо указать местоположение для того ресурса как это:
<HyperLink NavigateUri="http://www.site.com">
Web Site
</HyperLink>
Однако я нашел это сообщение блога с пользовательским TextBlock, который используется в качестве HyperLink и поддерживает события щелчка.