Wpf 为什么要设置;模板";属性在样式中断滚动中?

Wpf 为什么要设置;模板";属性在样式中断滚动中?,wpf,scrollbar,styles,Wpf,Scrollbar,Styles,我正在使用创建一个多列树视图,我注意到滚动不再适用于此列表视图: 经过一番尝试后,我发现破坏滚动条的是TreeListView的“Template”属性设置: <Style TargetType="{x:Type l:TreeListView}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type l:TreeList

我正在使用创建一个多列树视图,我注意到滚动不再适用于此列表视图:

经过一番尝试后,我发现破坏滚动条的是TreeListView的“Template”属性设置:

<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>


为什么会这样?

我认为这是因为您编辑了WPF定义的控件模板。 它被定义为有一个滚动条。 您可以覆盖该模板,而不添加模板

我不是百分之百确定,但我想知道你为什么要从一开始就搞乱控件模板? 也许您要编辑的是数据模板?
DataTemplate决定如何显示由数据绑定绑定的对象。

您需要实现自己的滚动条,因为您正在覆盖默认模板


将ControlTemplate的
ItemsPresenter
包装在一个
ScrollViewer中

最后,我自己通过添加滚动条解决了这个问题-最初我以新的方式实现了这一点,刚刚获得了要滚动的原始内容,我发现如果我这样做,水平滚动条无法正常工作(标题没有滚动)

相反,我使用了来计算基本控件的功能,并在
列表视图的wjat上做了一个变化

我现在明白了为什么我在做这样的事情时需要设置整个模板了——我认为很简单的事情实际上是完全特定于我的控件的

这是我的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>

我的模板是否有办法包含原始/基本模板的内容?(这就是我认为
正在做的事情)我不认为
DataTemplate
是我所追求的-我需要将网格标题添加到树状视图的顶部,而不是树状视图中的每个项目。好吧,所以我发现我不能这样做,也意识到了为什么这样做无论如何都不起作用-谢谢你的帮助。谢谢-我在查看了MSDN上的了解原始控件是如何执行此操作的。
public static ResourceKey ScrollViewerStyleKey
{
    get
    {
        return new ComponentResourceKey(typeof(TreeListView), "TreeListView_ScrollViewerStyleKey");
    }
}