добавление заголовка в просмотрщик списка и сохранение virtualizingStackPanel (wp7) - PullRequest
3 голосов
/ 23 января 2011

Я хочу добавить заголовок в свои списки, и я делаю это с помощью шаблона.Проблема в том, что, если я расширяю шаблон ListBox, кажется, что virtualizingstackpanel списка больше не работает должным образом: он загружает весь контент, прежде чем я могу его прокрутить.

Я нашел некоторые соответствующие вопросы в stackoverflow, как это ( VirtualizingStackPanel перестает работать при переопределении шаблона элемента управления по умолчанию для ScrollViewer ), но данное решение не может быть применено к WP7: я не могу найти свойство с именем "CanContentScroll" из scrollviewer.

мой код

<Style x:Key="ListBoxStyle1" TargetType="ListBox">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="Padding" Value="0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBox">
                <ScrollViewer x:Name="ScrollViewer" 
                     BorderBrush="{TemplateBinding BorderBrush}" 
                     BorderThickness="{TemplateBinding BorderThickness}" 
                     Background="{TemplateBinding Background}" 
                     Foreground="{TemplateBinding Foreground}" 
                     Padding="{TemplateBinding Padding}">
                    <StackPanel>
                        <TextBlock Text="..."/>
                        <ItemsPresenter/>
                    </StackPanel>
                </ScrollViewer>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

1 Ответ

2 голосов
/ 24 января 2011

Если честно, я действительно не уверен, в чем здесь проблема;VirtualizingStackPanel все еще находится в визуальном дереве, но кажется, что ни один из элементов фактически не добавлен.Достаточно плохих новостей, хорошая новость в том, что я нашел способ обойти это, изменив стиль по умолчанию ScrollViewer, чтобы вместо него поместить заголовок, что приводит к двум стилям, которые выглядят следующим образом:

<Style x:Key="ScrollViewerStyle1" TargetType="ScrollViewer">
    <Setter Property="VerticalScrollBarVisibility" Value="Auto"/>
    <Setter Property="HorizontalScrollBarVisibility" Value="Disabled"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Padding" Value="0"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ScrollViewer">
                <Border BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Background="{TemplateBinding Background}">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="ScrollStates">
                            <VisualStateGroup.Transitions>
                                <VisualTransition GeneratedDuration="00:00:00.5" />
                            </VisualStateGroup.Transitions>
                            <VisualState x:Name="Scrolling">
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetName="VerticalScrollBar"
                                                        Storyboard.TargetProperty="Opacity"
                                                        To="1"
                                                        Duration="0" />
                                    <DoubleAnimation Storyboard.TargetName="HorizontalScrollBar"
                                                        Storyboard.TargetProperty="Opacity"
                                                        To="1"
                                                        Duration="0" />
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="NotScrolling">
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Grid Margin="{TemplateBinding Padding}">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="*" />
                        </Grid.RowDefinitions>
                        <TextBlock Text="Header" Style="{StaticResource PhoneTextLargeStyle}"/>
                        <ScrollContentPresenter x:Name="ScrollContentPresenter"
                                                Grid.Row="1"
                                                Content="{TemplateBinding Content}"
                                                ContentTemplate="{TemplateBinding ContentTemplate}" />
                        <ScrollBar x:Name="VerticalScrollBar"
                                    Grid.RowSpan="2"
                                    IsHitTestVisible="False"
                                    Opacity="0"
                                    Height="Auto"
                                    Width="5"
                                    HorizontalAlignment="Right"
                                    VerticalAlignment="Stretch"
                                    Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}"
                                    IsTabStop="False"
                                    Maximum="{TemplateBinding ScrollableHeight}"
                                    Minimum="0"
                                    Value="{TemplateBinding VerticalOffset}"
                                    Orientation="Vertical"
                                    ViewportSize="{TemplateBinding ViewportHeight}" />
                        <ScrollBar x:Name="HorizontalScrollBar"
                                    Grid.RowSpan="2"
                                    IsHitTestVisible="False"
                                    Opacity="0"
                                    Width="Auto"
                                    Height="5"
                                    HorizontalAlignment="Stretch"
                                    VerticalAlignment="Bottom"
                                    Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}"
                                    IsTabStop="False"
                                    Maximum="{TemplateBinding ScrollableWidth}"
                                    Minimum="0"
                                    Value="{TemplateBinding HorizontalOffset}"
                                    Orientation="Horizontal"
                                    ViewportSize="{TemplateBinding ViewportWidth}" />
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style x:Key="ListBoxStyle2" TargetType="ListBox">
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Foreground" Value="{StaticResource PhoneForegroundBrush}"/>
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled"/>
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="Padding" Value="0"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBox">
                <ScrollViewer x:Name="ScrollViewer"
                                Grid.Row="1"
                                Style="{StaticResource ScrollViewerStyle1}"
                                Foreground="{TemplateBinding Foreground}"
                                Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                Padding="{TemplateBinding Padding}">
                    <ItemsPresenter />
                </ScrollViewer>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
...