Как установить перенос для HyperlinkButton с привязкой к содержимому / тексту? - PullRequest
6 голосов
/ 16 ноября 2010

Я связываю коллекцию (RSS-канал) в поле со списком, например:

<ListBox Margin="0,0,-12,0" ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Margin="0,0,0,17" Width="432">
                <HyperlinkButton Content={Binding Title} NavigateUri="{Binding Link}" />
                <TextBlock Text="{Binding Description}" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Это прекрасно работает - данные отображаются правильно и т. Д. Но теперь, когда я изменил его, чтобы использовать перенос текста,название больше не отображается

Вот проблемный код.

<ListBox Margin="0,0,-12,0" ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Margin="0,0,0,17" Width="432">
                <HyperlinkButton NavigateUri="{Binding Link}">
                    <TextBlock Text="{Binding Title}" TextWrapping="Wrap" />
                </HyperlinkButton>
                <TextBlock Text="{Binding Description}" TextWrapping="Wrap" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

Я не думаю, что проблема связана с атрибутом «TextWrapping», поскольку я пробовал без него, но он все равно не работал.Итак, мой вопрос: как заставить работать что-то подобное?Я просто хочу отобразить гиперссылку с обернутым связанным текстом.Это похоже на довольно простую вещь, но все же так сложно.Помощь

Ответы [ 2 ]

7 голосов
/ 20 мая 2011

У меня была точно такая же проблема, и я не мог понять, почему она не работает, пока я не наткнулся на этот блог сообщение Мистер Гудкат . В своем посте он сказал, что из-за некоторых оптимизаций, сделанных для WP7 в Silverlight, базовая функциональность, которая работает в обычном Silverlight, не работает правильно для WP7 Silverlight. Вместо использования он предлагает вместо этого изменить стиль.

Самый простой способ отредактировать шаблоны по умолчанию - это использовать Expression Blend, чтобы сделать его копию и работать оттуда. Когда вы сделаете это, вы увидите, что шаблон действительно имеет только текстовый блок для отображения содержимого. Вот почему использование другого элемента пользовательского интерфейса в качестве содержимого не работает для кнопки гиперссылки в WP7. Если вы хотите только перенос текста, достаточно изменить свойство TextWrapping для этого текстового блока.

<Style x:Key="HyperlinkButtonWrappingStyle"
        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}"
                            Margin="{StaticResource PhoneHorizontalMargin}"
                            Padding="{TemplateBinding Padding}">
                        <TextBlock x:Name="TextElement"
                                    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                    Text="{TemplateBinding Content}"
                                    TextDecorations="Underline"
                                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                    TextWrapping="Wrap" />
                    </Border>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Я предлагаю прочитать его пост в блоге для получения дополнительной информации и помощи.

1 голос
/ 20 мая 2011

Вот решение проблемы: http://www.pitorque.de/MisterGoodcat/post/WP7-snippet-analyzing-the-hyperlink-button-style.aspx#continue

Показанный выше код отлично работает в SL4, но не в Windows Phone 7; в основном по соображениям производительности. Используйте Blend для редактирования стиля HyperlinkButton, где вы обнаружите, что кнопка HyperlinkButton уже использует TextBlock для отображения содержимого и добавьте свойство TextWrapping = "Wrap".

...