2011-03-21 40 views
0

我使用this sample创建一个多列树视图和我注意到,滚动不再正常此列表视图:为什么设置样式中的“模板”属性中断滚动?

Broken scrollbars

一些上场后我周围发现已经被打破了滚动条位是用于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> 

这是为什么?

回答

0

在我通过在滚动自己加入解决了这个结尾 - 最初我这个实施Nieve酒店的方式,只是得到了原创内容滚动时,我发现水平滚动条不能正常工作,如果我这样做(标题不滚动)。

相反,我使用Control Template Reference来找出基本控件的作用,并做了ListView 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> 

上述要求我增加一些额外的属性来控制自己:

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

我认为这是因为您编辑由WPF定义的控件的模板。 并且它被定义为具有滚动条。 你重写该模板,不要添加一个。

我不是100%确定的,但我想知道为什么你搞乱控制模板开始? 也许你想编辑的是DataTemplate? DataTemplate决定如何呈现由数据绑定绑定的对象。

+0

有没有办法为我的模板中包含原来的内容/基础模板? (这是我认为''做的) – Justin 2011-03-21 01:55:59

+0

我不认为'DataTemplate'是我所追求的 - 我需要将网格标题添加到树视图的顶部,而不是每个项目在树视图中。 – Justin 2011-03-21 02:01:37

+0

好的,所以我想通了,我不能这样做,也意识到为什么这样做不会工作 - 谢谢你的帮助。 – Justin 2011-03-21 23:10:00

1

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

包装你的ControlTemplate的ItemsPresenterScrollViewer

+0

谢谢 - 我在MSDN上查看[控制模板参考](http://msdn.microsoft.com/en-us/library/aa970773.aspx)后完成了这个操作,以了解原始控件如何实现此功能。 – Justin 2011-03-21 23:11:05

相关问题