Windows runtime 在Windows应用商店应用程序上实现带下划线超链接的最佳方法?

Windows runtime 在Windows应用商店应用程序上实现带下划线超链接的最佳方法?,windows-runtime,winrt-xaml,windows-store-apps,Windows Runtime,Winrt Xaml,Windows Store Apps,据我所知,在Windows RT中,似乎没有为TextBlocks或HyperlinkButtons等实现下划线的功能,这看起来很可笑,但无论如何,有人有优雅的方法来解决这个问题吗,特别是要创建运行单击事件或绑定命令的链接 <Storyboard> <ObjectAnimationUsingKeyFrames

据我所知,在Windows RT中,似乎没有为
TextBlock
s或
HyperlinkButton
s等实现下划线的功能,这看起来很可笑,但无论如何,有人有优雅的方法来解决这个问题吗,特别是要创建运行
单击
事件或绑定命令的链接

                                <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>

正如您所看到的,开箱即用的支持似乎并不存在:

您可以使用带有嵌入式超链接按钮的RichTextBlock。如果您查看-您可以使用它绑定html文本片段(带有锚定标记),以使用链接文本设置自动填充RichTextBlock。

这就是我以前解决此问题的方法

<HyperlinkButton x:Name="ExamplesLink" Click="ExamplesLink_Click"
   Extensions:FrameworkElementExtensions.SystemCursor="Hand">
   <TextBlock>
      <Underline>
        <Run Text="Examples"/>
      </Underline>
   </TextBlock>
</HyperlinkButton>
                                <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>


如果您有,您也可以用上面的扩展名设置光标

以上Hyperlinkbutton的问题是,运行文本不可绑定,因此您必须为每个超链接按钮重复该文本块/下划线/运行模式。最好是把它变成一种风格

                                <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>
例如,如果您尝试此操作,它将不起作用,并且会发生未处理的异常

<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>
                                <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>

我发现解决这个问题的唯一方法是使用一个假下划线矩形和一个常规按钮,超链接文本也是可绑定的。然后根据指针是否在按钮上方显示下划线(假矩形)。以下是相关代码:

                                <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>
这不是最好的解决方案,但它是可绑定的内容(链接文本),它是一个通用的解决方案

<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>

                                <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>

看得见的
如果您需要(如我的情况)模板化
HyperlinkButton
,将绑定保持在视图中,您可以通过以下方式:

                                <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>
<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视图中,例如:

                                <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>
<HyperlinkButton Style="{StaticResource StandardHyperlinkButton}"
    Content="{Binding Path=myContent, Mode=OneWay}"
    Command="{StaticResource myCommand}"
    CommandParameter="{Binding Path=myContent, Mode=OneWay}" />


通过这种方式,您还可以解决@sacha绑定问题

简单,优雅,正是我想要的!派对有点晚了,但解决方案很棒!谢谢实现此功能时需要注意的一点是:我没有使用WinRT XAML toolkit,但是默认情况下,
HyperlinkButton
仍然将光标更改为
Hand
。您考虑的是旧版本的WPF<代码>运行
s在Windows应用商店应用程序中完全可以绑定。当我在Win8应用商店应用程序上执行此操作时,似乎无法在按钮模板中绑定运行。获得了Win8应用商店应用程序的一个工作示例,比如在样式中绑定到Button内容属性。也许模板绑定不起作用,您可能希望将示例发布到其中,以便最终得到修复。正如@Soheil的回答所示,在这两种情况下都很容易实现下划线。如果你考虑底层的“现代UI”设计原则来减少杂乱,那么在默认情况下,超链接没有被下划线似乎并不可笑。让每个人都开心。在样式中填充它应该在的位置,并在视图中绑定它应该在的位置。我认为这是正确的答案
                                <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>