Как сделать простую гиперссылку в XAML?
Все, что я хочу сделать, это сделать небольшую гиперссылку в XAML. Я все пробовал. Я сдаюсь.
Каков синтаксис для этого?
<StackPanel Width="70" HorizontalAlignment="Center">
<Hyperlink Click="buttonClose_Click" Cursor="Hand"
Foreground="#555" Width="31" Margin="0 0 0 15"
HorizontalAlignment="Right">Close</Hyperlink>
<Button Width="60" Margin="0 0 0 3">Test 1</Button>
<Button Width="60" Margin="0 0 0 3">Test 2</Button>
<Button Width="60" Margin="0 0 0 3">Test 3</Button>
<Button Width="60" Margin="0 0 0 3">Test 4</Button>
</StackPanel>
Команда Visual Studio: в Visual Studio 2010 я хочу, чтобы Clippy всплыл и сказал: "Кажется, вы пытаетесь сделать гиперссылку" и расскажите мне, как это сделать. Разве вы не можете сделать это с помощью MEF? Это было бы ретро круто, и эти маленькие "как я делаю то, что я уже знаю, как делать в HTML", проблемы выжигают так много времени в процессе обучения с помощью XAML.
Ответы
Ответ 1
Вы можете использовать кнопку с настраиваемым шаблоном управления, код ниже - это кнопка с ограниченным стилем гиперссылки (например, она поддерживает только текстовые гиперссылки), но, возможно, она укажет вам в правильном направлении.
<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>
Ответ 2
Вы не можете добавить гиперссылку в StackPanel - вы получите ошибку времени выполнения. (На самом деле, я удивлен, что это не ошибка времени компиляции.) Это потому, что Hyperlink не живет на стороне "управления" WPF с помощью <Button>
и <StackPanel>
и других вещей, которые выложены на прямоугольных фрагментах экрана и спуститься с UIElement
. Вместо этого он живет в "текстовой" стороне вещей, с <Bold>
и <Run>
и <Paragraph>
и другими обычно тексными вещами, которые переносятся словами и текут в строках и абзацах и опускаются от TextElement
.
Как только вы осознаете, что существуют две отдельные иерархии классов с разными макетами поведения, имеет смысл, что гиперссылка будет на "текстовой" стороне вещей (упрощает, например, иметь абзац с гиперссылкой посередине и даже для того, чтобы эта гиперссылка обертывалась через разрыв строки).
Но нет, это не так легко обнаружить, когда вы начинаете.
Чтобы смешивать два мира и использовать гиперссылку в качестве элемента управления, все, что вам нужно сделать, это поместить его в TextBlock. TextBlock - это элемент управления (то есть, может идти в StackPanel), который содержит текстовые вещи (то есть может содержать гиперссылку):
<TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock>
Ответ 3
Попробуйте следующее:
<TextBlock>
<Hyperlink RequestNavigate="Hyperlink_RequestNavigate"
NavigateUri="http://www.msn.com">MSN</Hyperlink>
</TextBlock>
private void Hyperlink_RequestNavigate(object sender,
System.Windows.Navigation.RequestNavigateEventArgs e)
{
System.Diagnostics.Process.Start("http://www.msn.com");
}
Ответ 4
Вы можете обнаружить, что если вы привязаны к чему-либо, кроме простых текстовых значений, вам нужно будет использовать ContentPresenter
, иначе ничего не появится, это может быть правдой, если вы привязываетесь к источнику данных XML.
Свойство Trigger для IsMouseOver дает текст подчеркивание.
Пример, где я "m привязка к 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>
Ответ 5
<TextBlock>
<Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate">
<TextBlock Text="{Binding YourText}" />
</Hyperlink>
</TextBlock>
Это свяжет любой связанный текст во вложенном текстовом блоке, я еще не нашел лучшего способа, я бы хотел, чтобы первый текстовый блок не был там, если это было возможно.
Это также будет работать и с DataTemplates.
Ответ 6
Обычно значение гиперссылки заключается в предоставлении привязке для отправки пользователя на другую страницу или, как правило, другому ресурсу, поэтому он реализован таким образом, и вы должны указать местоположение для этого ресурса следующим образом:
<HyperLink NavigateUri="http://www.site.com">
Web Site
</HyperLink>
Однако я нашел этот блог с помощью специального текстового блока, который используется как HyperLink и поддерживает события click.
Ответ 7
Вы можете просто использовать HyperlinkButton.
Когда он будет нажат, URL-адрес будет отображаться в вашем веб-браузере:
<HyperlinkButton
NavigateUri="https://dev.windowsphone.com"
TargetName="_blank"
Content="Windows Phone Dev Center" />