Почему настройка свойства «Шаблон» при прокрутке с нарушением стиля? - PullRequest
0 голосов
/ 21 марта 2011

Я использую этот образец для создания многоколоночного представления дерева, и я заметил, что прокрутка больше не работает правильно для этого представления списка:

Broken scrollbars

После некоторой игры я обнаружил, что бит, который ломает полосы прокрутки, является настройкой свойства "Template" для TreeListView:

<Style TargetType="{x:Type l:TreeListView}">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="{x:Type l:TreeListView}">
        <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
          <DockPanel>
            <GridViewHeaderRowPresenter Columns="{StaticResource gvcc}" DockPanel.Dock="Top"/>
            <ItemsPresenter/>
          </DockPanel>
        </Border>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

Комментирование вышеприведенного исправляет полосы прокрутки (однако очевидно означает, что заголовки столбцов сетки не отображаются).Фактически я обнаружил, что даже следующий шаблон ломает полосы прокрутки:

<Style TargetType="{x:Type l:TreeListView}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type l:TreeListView}">
                <ItemsPresenter/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Почему это?

Ответы [ 3 ]

1 голос
/ 21 марта 2011

Вам необходимо реализовать собственные полосы прокрутки, поскольку вы перезаписываете шаблон по умолчанию.

Оберните ItemsPresenter вашего ControlTemplate в ScrollViewer

1 голос
/ 21 марта 2011

Я думаю, что это происходит потому, что вы редактируете шаблон элемента управления, определенный WPF. и определено иметь полосу прокрутки. Вы переопределяете этот шаблон и не добавляете его.

Я не уверен на 100% в этом, но мне интересно, почему вы начали возиться с шаблоном управления? может быть, что вы хотите редактировать это DataTemplate? DataTemplate решает, как представить объект, который связан Привязкой данных.

0 голосов
/ 22 марта 2011

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

Вместо этого я использовал Ссылка на шаблон элемента управления , чтобы выяснить, что делает базовый элемент управления, и сделал изменение в wjat, которое делает ListView.

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

Вот мой Xaml:

<Style x:Key="{x:Static local:TreeListView.ScrollViewerStyleKey}" TargetType="ScrollViewer">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ScrollViewer">
                <Grid Background="{TemplateBinding Background}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="Auto" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <DockPanel Margin="{TemplateBinding Padding}">
                        <ScrollViewer DockPanel.Dock="Top"
                            HorizontalScrollBarVisibility="Hidden"
                            VerticalScrollBarVisibility="Hidden"
                            Focusable="false">
                            <GridViewHeaderRowPresenter Margin="2,0,2,0"
                                Columns="{Binding Path=TemplatedParent.Columns, 
                                    RelativeSource={RelativeSource TemplatedParent}}"
                                ColumnHeaderContainerStyle="{Binding
                                    Path=TemplatedParent.View.ColumnHeaderContainerStyle,
                                    RelativeSource={RelativeSource TemplatedParent}}"
                                ColumnHeaderTemplate="{Binding
                                    Path=TemplatedParent.View.ColumnHeaderTemplate,
                                    RelativeSource={RelativeSource TemplatedParent}}"
                                ColumnHeaderTemplateSelector="{Binding 
                                    Path=TemplatedParent.View.ColumnHeaderTemplateSelector,
                                    RelativeSource={RelativeSource TemplatedParent}}"
                                AllowsColumnReorder="{Binding
                                    Path=TemplatedParent.View.AllowsColumnReorder,
                                    RelativeSource={RelativeSource TemplatedParent}}"
                                ColumnHeaderContextMenu="{Binding
                                    Path=TemplatedParent.View.ColumnHeaderContextMenu,
                                    RelativeSource={RelativeSource TemplatedParent}}"
                                ColumnHeaderToolTip="{Binding
                                    Path=TemplatedParent.View.ColumnHeaderToolTip,
                                    RelativeSource={RelativeSource TemplatedParent}}"
                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </ScrollViewer>
                        <ScrollContentPresenter Name="PART_ScrollContentPresenter"
                            KeyboardNavigation.DirectionalNavigation="Local"
                            CanHorizontallyScroll="False"
                            CanVerticallyScroll="False" />
                    </DockPanel>
                    <ScrollBar Name="PART_HorizontalScrollBar"
                        Orientation="Horizontal"
                        Grid.Row="1"
                        Maximum="{TemplateBinding ScrollableWidth}"
                        ViewportSize="{TemplateBinding ViewportWidth}"
                        Value="{TemplateBinding HorizontalOffset}"
                        Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" />
                    <ScrollBar Name="PART_VerticalScrollBar"
                        Grid.Column="1"
                        Maximum="{TemplateBinding ScrollableHeight}"
                        ViewportSize="{TemplateBinding ViewportHeight}"
                        Value="{TemplateBinding VerticalOffset}"
                        Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style TargetType="{x:Type local:TreeListView}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TreeView">
                <Border Name="Border" CornerRadius="1" BorderThickness="1">
                    <Border.BorderBrush>
                        <SolidColorBrush Color="{DynamicResource BorderMediumColor}" />
                    </Border.BorderBrush>
                    <Border.Background>
                        <SolidColorBrush Color="{DynamicResource ControlLightColor}" />
                    </Border.Background>
                    <ScrollViewer Style="{DynamicResource {x:Static local:TreeListView.ScrollViewerStyleKey}}">
                        <ItemsPresenter />
                    </ScrollViewer>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Выше было необходимо добавить некоторые дополнительные свойства к самому элементу управления:

public static ResourceKey ScrollViewerStyleKey
{
    get
    {
        return new ComponentResourceKey(typeof(TreeListView), "TreeListView_ScrollViewerStyleKey");
    }
}
...