wpf - ¿Cómo hacer un hipervínculo simple en XAML?
textblock wpf (8)
Todo lo que quiero hacer es crear un pequeño hipervínculo en XAML. He intentado todo. Me doy por vencido.
¿Cuál es la sintaxis para esto?
<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>
Equipo de Visual Studio: en Visual Studio 2010 quiero que aparezca Clippy y diga "Parece que está intentando hacer un hipervínculo" y dígame cómo hacerlo. ¿No puedes hacer eso con MEF? Sería retro cool, y estos pequeños problemas de "cómo hago lo que ya sé hacer en HTML" consumen tanto tiempo durante el proceso de aprendizaje con XAML.
No puede agregar un hipervínculo a un StackPanel; obtendrá un error de tiempo de ejecución. (En realidad, estoy un poco sorprendido de que no sea un error en tiempo de compilación). Esto se debe a que Hyperlink no vive en el lado de los "controles" de WPF con <Button>
y <StackPanel>
y otras cosas que están dispuestas en bloques rectangulares de pantalla y descender de UIElement
. En cambio, vive en el lado "textual" de las cosas, con <Bold>
y <Run>
y <Paragraph>
y otras cosas en general texty que envuelven las palabras y fluyen en líneas y párrafos, y descienden de TextElement
.
Una vez que se da cuenta de que hay dos jerarquías de clase separadas con comportamientos de diseño diferentes, tiene sentido que el hipervínculo esté en el lado del "texto" de las cosas (hace que sea fácil, por ejemplo, tener un párrafo con un hipervínculo en el centro, e incluso para eso hipervínculo para envolver un salto de línea).
Pero no, no es tan visible cuando estás empezando.
Para mezclar los dos mundos y usar un hipervínculo como control, todo lo que necesita hacer es ponerlo en un TextBlock. TextBlock es una cosa de control (es decir, puede ir en un StackPanel) que contiene elementos de texto (es decir, puede contener un hipervínculo):
<TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock>
Por lo general, el significado de un hipervínculo es dar un ancla para enviar al usuario a otra página o, en general, hablar a otro recurso, por lo que se implementa de tal manera y debe especificar la ubicación de ese recurso de esta manera:
<HyperLink NavigateUri="http://www.site.com">
Web Site
</HyperLink>
Sin embargo, encontré esta publicación de blog con un TextBlock personalizado que se usa como HyperLink y admite eventos de clics.
Prueba esto:
<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");
}
Puede encontrar que si está vinculando a algo más que valores de texto simples, necesitará usar ContentPresenter
contrario, no aparecerá nada, esto podría ser cierto si está vinculando a una fuente de datos XML.
Un activador de propiedad para IsMouseOver le da al texto un subrayado.
Un ejemplo donde estoy vinculando a XML se presenta a continuación.
<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>
Puede usar un botón con una plantilla de control personalizada, el siguiente código es un botón de estilo de hipervínculo limitado (por ejemplo, solo admite hipervínculos textuales), pero tal vez lo guiará en la dirección correcta.
<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>
Simplemente puede usar HyperlinkButton . Cuando se hace clic en, la URL se mostrará en su navegador web:
<HyperlinkButton
NavigateUri="https://dev.windowsphone.com"
TargetName="_blank"
Content="Windows Phone Dev Center" />
en UWP con mvvmcross estoy usando esto
<HyperlinkButton Content="{Binding TextSource, ConverterParameter=MyUrl, Converter={StaticResource Language},
FallbackValue=_MyUrl}" NavigateUri="http://www.google.com" />
<TextBlock>
<Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate">
<TextBlock Text="{Binding YourText}" />
</Hyperlink>
</TextBlock>
Esto vinculará cualquier texto enlazado en el bloque de texto anidado, no he encontrado una mejor manera todavía, me gustaría que el primer bloque de texto no esté allí si es posible. Esto funcionará también para DataTemplates.