在Windows Store应用中实现下划线超链接的最佳方法是什么?

12

正如@Soheil的答案所示,在这两种情况下实现下划线非常容易。如果您考虑到底层的“现代UI”设计原则以减少混乱,那么默认情况下不使用下划线来显示超链接似乎并不荒谬。 - HappyNomad
4个回答

18
这是我之前解决此问题的方法。
<HyperlinkButton x:Name="ExamplesLink" Click="ExamplesLink_Click"
   Extensions:FrameworkElementExtensions.SystemCursor="Hand">
   <TextBlock>
      <Underline>
        <Run Text="Examples"/>
      </Underline>
   </TextBlock>
</HyperlinkButton>

如果您拥有WinRT XAML工具包,您也可以像上面的扩展一样设置光标。

1
简单、优雅,正是我所寻找的! - c0D3l0g1c
有点晚了,但是很好的解决方案!谢谢!当我实现这个时,有一个需要注意的地方:我没有使用WinRT XAML工具包,但是HyperlinkButton默认仍然会将光标更改为Hand - Geoff James

9
如果需要(就像我的情况一样)模板化HyperlinkButton,并将绑定保留在视图中,可以按照以下方式进行:
<Style TargetType="HyperlinkButton"
    x:Key="StandardHyperlinkButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <TextBlock Style="{StaticResource BaseEntityDetailTextStyle}">
                    <Underline>
                        <Run Text="{Binding Path=Content, Mode=OneWay, RelativeSource={RelativeSource Mode=TemplatedParent}}" />
                    </Underline>
                </TextBlock>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

例如,在您的 XAML 视图中:

<HyperlinkButton Style="{StaticResource StandardHyperlinkButton}"
    Content="{Binding Path=myContent, Mode=OneWay}"
    Command="{StaticResource myCommand}"
    CommandParameter="{Binding Path=myContent, Mode=OneWay}" />

以这种方式,您也可以解决与绑定相关的 @sacha 问题!

3
没问题,看起来不错。将所有东西放在正确的样式中,并在视图中添加绑定。在我看来,这是正确的答案。 - sacha barber

1

您可以使用带有嵌入式HyperlinkButtons的RichTextBlock。如果您查看RichTextBlockExtensions - 您可以使用它来绑定HTML文本片段(带有锚点标记)以自动填充具有链接文本设置的RichTextBlock。


0
上述Hyperlinkbutton的问题,据我所知,是Run Text不可绑定,因此您最终必须为每个超链接按钮重复使用该TextBlock / Underline / Run模式。更好的做法是将其制作为样式。
例如,如果您尝试这样做,它将无法正常工作,会出现UnhandledException。
<HyperlinkButton Width="Auto" Height="Auto" Margin="2" 
        Content="{Binding DoctorName}"
        Command="{Binding ElementName=scheduleView, 
            Path=DataContext.NavigateToAppointmentsDetailCommand}"
        CommandParameter="{Binding DoctorName}">
    <HyperlinkButton.Template>
        <ControlTemplate>
            <TextBlock>
                <Underline>
                <Run Text="{TemplateBinding Content}"/>
                </Underline>
            </TextBlock>
        </ControlTemplate>
    </HyperlinkButton.Template>

</HyperlinkButton>

我发现解决这个问题的唯一方法是使用一个虚线下划线矩形和一个常规按钮,以便将超链接文本绑定。然后,我根据指针是否悬停在按钮上来显示下划线(虚线矩形)。以下是相关代码:
这不是最好的解决方案,但它可以绑定内容(链接文本),并且是通用的解决方案。
<Button Width="Auto" Height="Auto" Margin="2" 
        Style="{StaticResource HyperLinkButtonStyle}"
        Content="{Binding DoctorName}">
</Button>

                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames 
                    Storyboard.TargetProperty="(UIElement.Visibility)" 
                    Storyboard.TargetName="rect">
                                        <DiscreteObjectKeyFrame KeyTime="0">
                                            <DiscreteObjectKeyFrame.Value>
                                                <Visibility>Visible</Visibility>
                                            </DiscreteObjectKeyFrame.Value>
                                        </DiscreteObjectKeyFrame>
                                    </ObjectAnimationUsingKeyFrames>

                                </Storyboard>

                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="FocusStates"/>
                    </VisualStateManager.VisualStateGroups>
                    <StackPanel Orientation="Vertical">
                        <TextBlock x:Name="txt" 
                Text="{TemplateBinding Content}" 
                HorizontalAlignment="Center" 
                                    FontFamily="Segoe UI" FontSize="18" FontWeight="Thin"/>
                        <Rectangle x:Name="rect" Fill="White" Height="2" Visibility="Collapsed"
                            VerticalAlignment="Top" HorizontalAlignment="Stretch"/>
                    </StackPanel>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

你正在考虑一个旧版本的WPF。在Windows Store应用程序中,Run是完全可绑定的。 - HappyNomad
在Win8商店应用程序中,当我尝试在按钮模板内绑定Run时,似乎无法实现。请提供一个可行的示例,例如在样式中绑定到按钮内容属性。也许模板绑定不起作用。 - sacha barber
你可能希望将你的例子发布到 Microsoft Connect 上,以便最终得到修复。 - HappyNomad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接