56

我要做的就是在 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 做到这一点吗?这将是复古的酷,在学习 XAML 的过程中,这些“我如何做我已经知道如何在 HTML 中做的事情”的小问题消耗了很多时间。

4

8 回答 8

172

您不能将超链接添加到 StackPanel - 您将收到运行时错误。(实际上,我有点惊讶这不是编译时错误。)那是因为超链接不存在于 WPF 的“控件”一侧,<Button>以及<StackPanel>其他布局在矩形屏幕块上并从UIElement. 取而代之的是,它存在于事物的“文本”方面,与<Bold><Run><Paragraph>以及其他通常是文本的事物一起换行并在行和段落中流动,并从TextElement.

一旦您意识到有两个具有不同布局行为的独立类层次结构,超链接将位于事物的“文本”一侧是有道理的(例如,很容易在中间有一个带有超链接的段落,甚至为此用于换行的超链接)。

但是,不,当您刚开始时,它并不是那么容易被发现。

要混合这两个世界并使用超链接作为控件,您只需将其放入 TextBlock 中即可。TextBlock 是一个包含文本的东西(即,可以包含超链接)的控件(即,可以进入 StackPanel):

<TextBlock><Hyperlink Click="buttonClose_Click">Close</Hyperlink></TextBlock>
于 2009-08-09T23:06:57.633 回答
38

您可以将 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>
于 2009-02-11T12:26:13.907 回答
33

试试这个:

<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(e.Uri.AbsoluteUri);
}
于 2012-11-26T07:37:47.903 回答
8
<TextBlock>
  <Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate">
   <TextBlock Text="{Binding YourText}" />
  </Hyperlink>
</TextBlock>

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

于 2016-09-20T01:40:49.283 回答
4

您可能会发现,如果您要绑定的不是简单的文本值,您将需要使用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>
于 2010-08-10T09:56:05.627 回答
2

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

<HyperlinkButton
    NavigateUri="https://dev.windowsphone.com"
    TargetName="_blank"
    Content="Windows Phone Dev Center" />
于 2012-12-21T01:12:20.553 回答
1

通常,超链接的含义是提供一个锚点以将用户发送到另一个页面或通常与另一个资源交谈,因此它是以这种方式实现的,您必须像这样指定该资源的位置:

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

但是,我发现这篇博客文章带有一个自定义的 TextBlock,它用作超链接并支持点击事件。

于 2009-02-10T09:48:07.780 回答
0

在带有 mvvmcross 的 UWP 中我正在使用这个

  <HyperlinkButton Content="{Binding TextSource, ConverterParameter=MyUrl, Converter={StaticResource Language},
           FallbackValue=_MyUrl}" NavigateUri="http://www.google.com" />
于 2018-03-01T16:08:18.060 回答