2011-12-02 131 views
1

我在其数据模板中有ListBoxGrid。在Grid我有一个Splitter控制。现在的问题是:当我绑定列表框的项目源,然后多个网格内部生成,因为这些网格我的分离器控制不起作用。它工作不可预测。这意味着当我将分离器控制移到左侧时,它会平稳移动,但当我尝试从另一行移动时,它不会移回。请帮助我解决这个问题。如何在ListBox控件中保持gridsplitter不能滚动

请参阅示例代码更多的参考资料:

<Window x:Class="MultiColumnList.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:MultiColumnList" 
Title="Window1" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="400" d:DesignWidth="400" SizeToContent="WidthAndHeight"> 
<Grid > 
    <Grid.Resources> 
     <XmlDataProvider x:Key="BlogData" XPath="Blogs/Blog"> 
      <x:XData> 
       <Blogs xmlns=""> 
        <Blog> 
         <BlogSite>simplegeek.com</BlogSite> 
         <Blogger OnlineStatus="Offline">Chris Anderson</Blogger> 
         <Url>http://simplegeek.com</Url> 
        </Blog> 
        <Blog> 
         <BlogSite>fortes.com</BlogSite> 
         <Blogger OnlineStatus="Offline">Fil Fortes</Blogger> 
         <Url>http://fortes.com/work</Url> 
        </Blog> 
        <Blog> 
         <BlogSite>Longhorn Blogs</BlogSite> 
         <Blogger OnlineStatus="Online">Rob Relyea</Blogger> 
         <Url>http://www.longhornblogs.com/rrelyea/</Url> 
        </Blog> 
        <Blog> 
         <BlogSite>designerslove.net</BlogSite> 
         <Blogger OnlineStatus="Online">Nathan Dunlap</Blogger> 
         <Url>http://designerslove.net/</Url> 
        </Blog> 
        <Blog> 
         <BlogSite>blogs.msdn.com</BlogSite> 
         <Blogger OnlineStatus="Online">Karsten Januszewski</Blogger> 
         <Url>http://blogs.msdn.com/karstenj</Url> 
        </Blog> 
        <Blog> 
         <BlogSite>weblogs.asp.net</BlogSite> 
         <Blogger OnlineStatus="Online">Greg Schecter</Blogger> 
         <Url>http://weblogs.asp.net/greg_schechter</Url> 
        </Blog> 
        <Blog> 
         <BlogSite>blogs.msdn.com</BlogSite> 
         <Blogger OnlineStatus="Online">Tim Sneath</Blogger> 
         <Url>http://blogs.msdn.com/tims/</Url> 
        </Blog> 

        <Blog> 
         <BlogSite>weblogs.asp.net</BlogSite> 
         <Blogger OnlineStatus="Offline">Marcelo Lopez-Ruiz</Blogger> 
         <Url>http://weblogs.asp.net/marcelolr/</Url> 
        </Blog> 
        <Blog> 
         <BlogSite>blogs.msdn.com</BlogSite> 
         <Blogger OnlineStatus="Online">Kevin Moore</Blogger> 
         <Url>http://blogs.msdn.com/okoboji/default.aspx</Url> 
        </Blog> 
        <Blog> 
         <BlogSite>laurenlavoie.com</BlogSite> 
         <Blogger OnlineStatus="Offline">Lauren Lavoie</Blogger> 
         <Url>http://laurenlavoie.com/</Url> 
        </Blog> 
       </Blogs> 
      </x:XData> 
     </XmlDataProvider> 

     <DataTemplate x:Key="BlogDataTemplate"> 

      <Grid TextBlock.FontSize="12" LayoutUpdated="Grid_LayoutUpdated"> 

       <Grid.ColumnDefinitions> 
        <ColumnDefinition x:Name="LeftColumn" Width="Auto" SharedSizeGroup="BloggerColumn"/> 
        <ColumnDefinition x:Name="Center" Width="*" SharedSizeGroup="BlogSiteColumn"/> 
        <ColumnDefinition x:Name="Right" Width="*" SharedSizeGroup="OnlineStatusColumn"/> 
       </Grid.ColumnDefinitions> 

       <TextBlock Grid.Column="0" Margin="10,0,10,0" Text="{Binding XPath=Blogger}"/> 
       <GridSplitter Grid.Column="1" Width="2" HorizontalAlignment="Center" Background="Black" DragCompleted="GridSplitter_DragCompleted"/> 

       <TextBlock Grid.Column="2" Margin="10,0,10,0" Text="{Binding XPath=Blogger/@OnlineStatus}"/> 
      </Grid> 
     </DataTemplate> 

     <ControlTemplate x:Key="Header" TargetType="{x:Type Button}"> 
      <Border Background="LightGray" 
       TextBlock.Foreground="white" 
       TextBlock.FontSize="20" 
       Padding="10,3,10,4"> 
       <ContentPresenter/> 
      </Border> 
     </ControlTemplate> 

     <Grid x:Key="ListHeader" Margin="5" > 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" SharedSizeGroup="BloggerColumn"/> 
       <ColumnDefinition Width="*" SharedSizeGroup="BlogSiteColumn"/> 
       <ColumnDefinition Width="*" SharedSizeGroup="BloggerOnlineStatusColumn"/> 
      </Grid.ColumnDefinitions> 
      <Button Grid.Column="0" Template="{StaticResource Header}">Blogger</Button> 
      <GridSplitter Grid.Column="1" Width="2" Background="Black" HorizontalAlignment="Stretch" DragCompleted="GridSplitter_DragCompleted" /> 
      <Button Grid.Column="2" Template="{StaticResource Header}">Status</Button> 
     </Grid> 


     <Style x:Key="HeaderedScrollViewer" TargetType="{x:Type ScrollViewer}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type 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" 
              local:SetHorizontalOffset.Offset="{Binding 
               RelativeSource={RelativeSource TemplatedParent}, 
               Path=HorizontalOffset}" 
              HorizontalScrollBarVisibility="Hidden" 
              VerticalScrollBarVisibility="Hidden" 
              Focusable="false" 
              Content="{StaticResource ListHeader}"> 
           </ScrollViewer> 

           <ScrollContentPresenter Name="PART_ScrollContentPresenter" 
            KeyboardNavigation.DirectionalNavigation="Local"/> 
          </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 x:Key="{x:Type ListBox}" TargetType="{x:Type ListBox}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <ScrollViewer Style="{StaticResource HeaderedScrollViewer}" 
             Grid.IsSharedSizeScope="True"> 
          <StackPanel IsItemsHost="true"/> 
         </ScrollViewer> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

    </Grid.Resources> 

    <ListBox ItemsSource="{Binding Source={StaticResource BlogData}}" 
      ItemTemplate="{StaticResource BlogDataTemplate}" Height="400" Width="600"/> 
</Grid> 

回答

0

您遇到的主要问题是包含您的分路器列的列宽的明星。这两列的宽度应为2,以匹配GridSplitters上的宽度2。第二个问题是左侧标题与左侧列数据的最小尺寸不同。另外,两个GridSplitters都应该将Horizo​​ntalAlignment设置为Center。

+0

感谢您的评论,但您能否以合理的方式解释此事。所以我可以理解我应该怎么做,以便将来不会发生这种问题。 –

+0

问题是,网格拆分器(如您在原始代码中配置的那样)会扩大它移动时所在的列。 – Brannon