如何在XAML中创建一个简单的超链接?

时间:2009-02-10 09:22:02

标签: wpf xaml hyperlink

我想做的就是在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。

8 个答案:

答案 0 :(得分:167)

您无法将超链接添加到StackPanel - 您将收到运行时错误。 (实际上,我有点惊讶它不是编译时错误。)那是因为Hyperlink并不存在于WPF的“控件”端,<Button><StackPanel>以及其他已经存在的东西在矩形的屏幕块上,从UIElement下降。相反,它存在于事物的“文本”方面,<Bold><Run>以及<Paragraph>和其他一般性的文本事物,包装和流入行和段落并从{下降{1}}。

一旦你意识到有两个独立的类层次结构具有不同的布局行为,那么超链接将在事物的“文本”方面是有意义的(例如,使得在中间具有带超链接的段落变得容易,并且即使是用于换行换行的超链接。)

但不,当你刚开始的时候,它不是那么容易被发现。

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

TextElement

答案 1 :(得分:37)

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

<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 :(得分:23)

试试这个:

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

答案 3 :(得分:5)

<TextBlock>
  <Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate">
   <TextBlock Text="{Binding YourText}" />
  </Hyperlink>
</TextBlock>

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

答案 4 :(得分:4)

您可能会发现,如果您绑定到除简单文本值以外的任何内容,则需要使用ContentPresenter,否则不会出现任何内容,如果您绑定到XML数据源,则可能会出现这种情况。 / p>

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>

答案 5 :(得分:2)

您只需使用HyperlinkButton即可。 单击它时,URL将显示在Web浏览器中:

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

答案 6 :(得分:1)

通常,超级链接的含义是给一个锚点将用户发送到另一个页面或一般说到另一个资源,所以它以这种方式实现,你必须像这样指定该资源的位置: / p>

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

但是,我发现this blog帖子带有自定义TextBlock,用作HyperLink并支持点击事件。

答案 7 :(得分:0)

在UWP中使用mvvmcross我正在使用此

  <HyperlinkButton Content="{Binding TextSource, ConverterParameter=MyUrl, Converter={StaticResource Language},
           FallbackValue=_MyUrl}" NavigateUri="http://www.google.com" />