如何在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中,我想让Clippypopup并说“看起来你正在尝试创build一个超链接”,并告诉我如何去做。 你不能用MEF做这个吗? 这将是复古的酷,而这些小小的“我怎么做我已经知道如何做的HTML”问题在XAML的学习过程中耗费了太多的时间。

您可以使用自定义控件模板的button,下面的代码是一个有限的超链接样式button(例如,它只支持文本超链接),但也许它会指向你在正确的方向。

 <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的“控制”一侧,与<Button><StackPanel>和其他东西在矩形块屏幕从UIElement下降。 相反,它生活在事物的“文本”一侧,使用<Bold><Run><Paragraph>以及其他一些通常为texty的东西,这些东西都是用行和段落的formsstream动并从TextElement下降。

一旦你意识到有两个不同的布局行为的单独的类层次结构,超链接将在事物的“文本”一侧是有意义的(例如,可以很容易地在中间有一个超链接的段落,甚至为此超链接换行换行)。

但是,不,当你出发的时候,这是不可能的。

要混合两个世界,并使用超链接作为控件,所有你需要做的就是把它放在一个TextBlock中。 TextBlock是一个控制的事情(即,可以进入一个StackPanel),其中包含文本的事情(即,可以包含一个超链接):

 <TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock> 

尝试这个:

 <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"); } 

您可能会发现,如果您绑定到除简单文本值之外的其他任何内容,则需要使用ContentPresenter否则不会显示任何内容,如果绑定到XML数据源,则可能为true。

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> 
 <TextBlock> <Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate"> <TextBlock Text="{Binding YourText}" /> </Hyperlink> </TextBlock> 

这将链接嵌套的文本块中的任何绑定的文本,我还没有find更好的方法,我想第一个文本块不能在那里,如果可能的话。 这也适用于DataTemplates。

通常,超链接的意思是给一个锚点来发送用户到另一个页面,或者一般来说到另一个资源,所以它的实现是这样的,你必须指定这个资源的位置:

 <HyperLink NavigateUri="http://www.site.com"> Web Site </HyperLink> 

不过,我发现这个博客文章中有一个用作HyperLink的自定义TextBlock,并支持点击事件。

你可以简单地使用HyperlinkBut​​ton 。 点击时,该URL将显示在您的Web浏览器中:

 <HyperlinkButton NavigateUri="https://dev.windowsphone.com" TargetName="_blank" Content="Windows Phone Dev Center" />