Лучший способ достичь подчеркнутой гиперссылки в приложениях Windows Store?
Из того, что я прочитал, похоже, нет никакой функции для достижения подчеркивания для TextBlock
или HyperlinkButton
или тому подобного в Windows RT, который выглядит смехотворным, но в любом случае у кого-то есть элегантный подход к решению этой проблемы, в частности, для создания ссылки, в которой выполняется команда Click
или команда привязки?
Как вы можете видеть, поддержка "из коробки" не существует: http://social.msdn.microsoft.com/Forums/en-CA/winappswithcsharp/thread/cba0c363-60da-4e
Ответы
Ответ 1
Вот как я решил эту проблему раньше.
<HyperlinkButton x:Name="ExamplesLink" Click="ExamplesLink_Click"
Extensions:FrameworkElementExtensions.SystemCursor="Hand">
<TextBlock>
<Underline>
<Run Text="Examples"/>
</Underline>
</TextBlock>
</HyperlinkButton>
Если у вас есть инструментарий WinRT XAML, вы можете также установить курсор с расширением, как указано выше.
Ответ 2
Если вам понадобится (как в моем случае) шаблон 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
Вы можете использовать RichTextBlock со встроенными гиперссылками. Если вы посмотрите на RichTextBlockExtensions - вы можете использовать его для привязки html-фрагментов текста (с привязными тегами) для автоматического заполнения RichTextBlock связанным текстом установка.
Ответ 4
Проблема с вышеперечисленным гиперссылкой AFAIK заключается в том, что 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>