Silverlight: сделать кнопку гиперссылки похожей на текстовый блок? - PullRequest
3 голосов
/ 29 декабря 2010

Я пытаюсь сделать все слова в текстовом блоке, которые являются кликабельными URI.Вот подход, который я выбрал:

    private static void onTextChanged(DependencyObject dependObj, DependencyPropertyChangedEventArgs e)
    {
        WrapPanel wrapPanel = ((HyperlinkTextBlock)dependObj).LayoutRoot;
        wrapPanel.Children.Clear();

        // TODO: use a real wordbreaker?
        // adding an extra space to the end of the last word. Cry.
        IList<string> words = ((string)e.NewValue).Split(' ').Select(word => word + " ").ToList();
        foreach (string word in words)
        {
            Uri uri;
            if (Uri.TryCreate(word, UriKind.Absolute, out uri))
            {
                // TODO the style is off - the text is too big
                wrapPanel.Children.Add(new HyperlinkButton()
                {
                    Content = word,
                    NavigateUri = uri,
                    TargetName = "_blank",
                    Margin = new Thickness(0),
                    Padding = new Thickness(0),
                });
            }
            else
            {
                wrapPanel.Children.Add(new TextBlock() { Text = word, TextWrapping = TextWrapping.Wrap });
            }
        }
    }

(я был бы полностью готов к более XAML-ориентированному / декларативному способу сделать это, но я не уверен, как поступитьделает это.)

Это прекрасно работает (за исключением того, что было бы неплохо использовать настоящий разрушитель слов), за исключением того, что HyperlinkButton выглядит забавно.Он слишком большой, и текст не будет переноситься.Похоже, что он также имеет некоторое смещение, которое я пытался исправить, установив Margin и Padding в 0, но это не решило проблему.

Есть другие идеи?На самом деле я хочу HyperlinkText вместо HyperlinkButton, но я не думаю, что Silverlight 3 для Windows Phone 7 предлагает это.

Ответы [ 3 ]

2 голосов
/ 02 марта 2011

Вот решение, которое я нашел, извлекая стиль для кнопки гиперссылки, а затем внося изменения в области, которые мне не безразличны (этот странный отступ, как вы упомянули).Таким образом, поведение точно такое же, за исключением тех вещей, которые вы хотите изменить.

При создании кнопки гиперссылки также установите свойство стиля, как показано ниже:

var button = new HyperlinkButton
{
    ...
    Style = (Style) Resources["HyperlinkButtonWithNoIndent"]
};

Затем в вашемстранице, добавьте следующий стиль к ресурсам:

<Style x:Key="HyperlinkButtonWithNoIndent" TargetType="HyperlinkButton">
    <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="FontSize" Value="{StaticResource PhoneFontSizeMedium}"/>
    <Setter Property="Padding" Value="0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="HyperlinkButton">
                <Border Background="Transparent">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal"/>
                            <VisualState x:Name="MouseOver"/>
                            <VisualState x:Name="Pressed">
                                <Storyboard>
                                    <DoubleAnimation Duration="0" To="0.5" Storyboard.TargetProperty="Opacity" Storyboard.TargetName="TextElement"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Disabled">
                                <Storyboard>
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="TextElement">
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource PhoneDisabledBrush}"/>
                                    </ObjectAnimationUsingKeyFrames>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Border Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}">
                        <TextBlock x:Name="TextElement" Text="{TemplateBinding Content}" TextDecorations="Underline" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
1 голос
/ 30 декабря 2010

Я никогда не пытался сделать это с TextBlock, но он работает с Image и StackPanel, поэтому он должен работать и в вашем случае. Добавьте обработчик для жеста Tap к своему TextBlock и прослушайте его. Затем в обработчике событий вы можете перейти к URL.

TextBlock MyTextBlock = new TextBlock() { Text = "Tap Me!" };
GestureListener listener = GestureService.GetGestureListener( MyTextBlock );
listener.Tap += new EventHandler<GestureEventArgs>( OnMyTextBlockTapped );

И обработчик событий выглядит так:

void OnMyTextBlockTapped( object sender, GestureEventArgs e )
{
  // Navigate to URL
}

Вы можете даже анимировать касание, запустив Storyboard в обработчике событий и выполнив навигацию после завершения анимации.

0 голосов
/ 30 декабря 2010

Вы пробовали использовать элемент управления в blend?Вы должны полностью контролировать стиль презентации для всех составляющих частей, составляющих HyperlinkButton.

  1. Щелкните элемент управления
  2. Редактировать шаблон
  3. Редактировать копию
  4. Отформатировать

Вы можете повторно использовать полученный стиль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...