【问题标题】:How to make a simple hyperlink in XAML?如何在 XAML 中创建一个简单的超链接?
【发布时间】:2010-10-06 14:34:35
【问题描述】:

我想做的只是在 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 中做的事情”的小问题消耗了很多时间。

【问题讨论】:

  • +1 - “我如何做我已经知道如何在 HTML 中做的事情”问题在 XAML 的学习过程中消耗了很多时间。” - 你没看错。跨度>
  • 恕我直言,将 Clippy 放入 VS 是一个非常糟糕的主意!你能想象那个烦人的回形针会发现你正在编程的东西并提出无效的建议吗?我认为您可以通过在开始之前学习 WPF 来避免这些问题。
  • 所以和你在一起;在编写 XAML 时,我一直在感叹“如果这只是 css……”。

标签: wpf xaml hyperlink


【解决方案1】:

您无法将超链接添加到 StackPanel - 您会收到运行时错误。 (实际上,我有点惊讶它不是编译时错误。)那是因为超链接不存在于 WPF 的“控件”端,&lt;Button&gt;&lt;StackPanel&gt; 以及其他布置在矩形块上的东西屏幕并从UIElement下降。相反,它存在于事物的“文本”方面,与 &lt;Bold&gt;&lt;Run&gt;&lt;Paragraph&gt; 以及其他一般文本的事物,它们以行和段落的形式自动换行并从 TextElement 下降。

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

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

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

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

【讨论】:

    【解决方案2】:

    您可以将 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>
    

    【讨论】:

      【解决方案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(e.Uri.AbsoluteUri);
      }
      

      【讨论】:

      • 工作正常,一个建议,如果超链接被称为 btnHyperlink,那么你可以修改事件处理程序: private void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e) { System.Diagnostics. Process.Start(btnHyperlink.NavigateUri.AbsoluteUri); }
      • System.Diagnostics.Process.Start(e.Uri.AbsoluteUri) 怎么样
      【解决方案4】:
      <TextBlock>
        <Hyperlink NavigateUri="{Binding YourUri}" RequestNavigate="YourRequestNavigate">
         <TextBlock Text="{Binding YourText}" />
        </Hyperlink>
      </TextBlock>
      

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

      【讨论】:

        【解决方案5】:

        您可能会发现,如果您要绑定的不是简单的文本值,则需要使用 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>
        

        【讨论】:

          【解决方案6】:

          您可以简单地使用HyperlinkButton。 当点击它时,该 URL 将显示在您的网络浏览器中:

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

          【讨论】:

          • 在通用 Windows 应用程序目标名称的 XAML 中无效。仅使用 NavigateUri 和 Content。
          【解决方案7】:

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

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

          但是,我发现 this blog 帖子带有一个自定义 TextBlock,它用作超链接并支持点击事件。

          【讨论】:

          • 这应该是超链接,而不是超链接。
          • 这不是必需的。只需从超链接中获取 RequestNavigate 事件。
          【解决方案8】:

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

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

          【讨论】:

            猜你喜欢
            • 2010-12-30
            • 2016-06-03
            • 2022-10-20
            • 1970-01-01
            • 1970-01-01
            • 2016-10-02
            • 1970-01-01
            • 2021-09-30
            • 1970-01-01
            相关资源
            最近更新 更多