2014-03-12 65 views
1

我的ListBox有問題。我寫了幾個我在ListBox中使用的DataTemplates。其中每一個包含一個網格,並可能包含一個嵌套的ListBox,具體取決於該項目。 我的問題是:這些嵌套列表框的高度似乎不同於根列表框的高度。此外,似乎有時候上​​面的元素有一個像素邊距。嵌套的ListBox與DataTemplates的差異

NestedGrids

有人曾經遇到過這個問題,也或許解決了嗎?

XAML碼:

  <!-- Template for SubData-Items --> 
     <DataTemplate x:Key="DataTemplate"> 

      <Grid x:Name="baseGrid" Grid.Column="0" Grid.ColumnSpan="999" Background="Violet"> 

       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="{Binding ElementName=Col0, Path=Width}" /> 
        <ColumnDefinition Width="{Binding ElementName=Col1, Path=Width}" /> 
       </Grid.ColumnDefinitions> 

       <Grid.RowDefinitions> 
        <RowDefinition Height="{Binding ElementName=Row0, Path=Height}"/> 
       </Grid.RowDefinitions> 

       <TextBlock Grid.Column="1" Text="{Binding Bezeichnung}" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="12" /> 
       <Line Grid.ColumnSpan="999" Stroke="Black" X1="0" X2="{Binding ElementName=baseGrid, Path=ActualWidth, Mode=OneWay}" Y1="0" Y2="0" VerticalAlignment="Bottom" /> 

      </Grid> 

     </DataTemplate> 

     <!-- Template for Items --> 
     <DataTemplate x:Key="GroupDataTemplate"> 

      <Grid Grid.ColumnSpan="999" Background="Blue"> 

       <Grid.RowDefinitions> 
        <RowDefinition Height="{Binding ElementName=Gantt, Path=GridRowHeight}" /> 
        <RowDefinition Height="*"/> 
       </Grid.RowDefinitions> 

       <Grid x:Name="baseGrid" Grid.Column="0" Grid.ColumnSpan="999"> 

        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="{Binding ElementName=Col0, Path=Width}" /> 
         <ColumnDefinition Width="{Binding ElementName=Col1, Path=Width}" /> 
        </Grid.ColumnDefinitions> 

        <Grid.RowDefinitions> 
         <RowDefinition Height="{Binding ElementName=Row0, Path=Height}"/> 
        </Grid.RowDefinitions> 

        <TextBlock Grid.Column="1" Text="{Binding Bezeichnung}" HorizontalAlignment="Left" VerticalAlignment="Center" FontSize="12" /> 

       </Grid> 

       <Grid x:Name="expandedGrid" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="999"> 

        <ListBox x:Name="LBMaGruppen" ItemTemplate="{StaticResource DataTemplate}" ItemsSource="{Binding SubdataObjects}"                     
            VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Height="Auto" Margin="0,0,2,0" 
            ScrollViewer.CanContentScroll="false" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled" BorderThickness="0" /> 

       </Grid> 

      </Grid> 

     </DataTemplate> 

    <!-- Grid with ListBox --> 
    <Grid> 

     <Grid.RowDefinitions> 
      <RowDefinition x:Name="Row0" Height="34"/> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition x:Name="Col0" Width="25" /> 
      <ColumnDefinition x:Name="Col1" Width="*" /> 
     </Grid.ColumnDefinitions> 

     <ListBox Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="999" ItemsSource="{Binding ItemSource, Mode=OneWay}" 
      ItemTemplate="{StaticResource GroupDataTemplate}" 
      VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="Auto"    
      ScrollViewer.CanContentScroll="true" 
      ScrollViewer.IsDeferredScrollingEnabled="False" 
      ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
      ScrollViewer.VerticalScrollBarVisibility="Disabled" 
      FontSize="10" /> 

    </Grid> 
+1

嗨,請使用XAML更新您的問題,以便我們可以看到您如何嵌套一切。 – AlSki

+0

在您的子項ListBox DataTemplate中,您將RowHeight綁定到「Grid with ListBox」中Row的高度,我相當確信這不起作用,但更重要的是,我不確定您是否想要這樣做!通過將嵌套列表框設置爲與父列表框相同的大小,只會導致父列表框增長。你究竟想達到什麼目的?如果它正在更改邊距,則可以嘗試使用負值來移除所看到的額外一個像素。 – Bijington

+0

我試圖實現的是列表中的每一行都具有相同的高度,因爲它必須適合其右側的可視元素,該元素具有垂直畫出的線條。我也試圖給他們一個負邊界,但那隻會導致網格看不見上面的線。 –

回答

1

將「Margin =」 - 2,0,0,0「和Padding =」 - 1「添加到名爲ListBox的」LBMaGruppen「中。

<ListBox x:Name="LBMaGruppen" ItemTemplate="{StaticResource DataTemplate}" ItemsSource="{Binding SubdataObjects}"                     
           VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" Height="Auto" Margin="-2,0,0,0" Padding="-1" 
           ScrollViewer.CanContentScroll="false" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ScrollViewer.VerticalScrollBarVisibility="Disabled" BorderThickness="0" /> 

Running with those modifications

另外, 「根」 元素的高度被綁定到{結合的ElementName =甘特,路徑= GridRowHeight},而 「子」 元素的高度,以{結合的ElementName = ROW0,路徑=高度},所以這必須導致差異。

+0

+1和賞金爲一個簡單和乾淨的解決方案。沒想到設置填充屬性。謝謝 –

0

看來你有自動高度在所有的列表框設置。您可以嘗試將高度設置爲特定的大小。編輯:我看到你已經有ScrollViewer設置。我認爲將盒子的高度設置爲特定的大小而不是自動將會做你想要的。

至於元素之間的填充請參閱ListBox.ItemContainerSyle應該允許您設置元素之間的邊距。

+0

將高度設置爲特定值不是解決方案,因爲每個項目都可以有x個子項目。我以前不知道。滾動查看器只能出現在根列表框中,因爲其中的行必須適合其右側的可視元素。利用保證金財產也沒有效果。 –

2

qqbenq給了一個非常好的解決方案。這是另一種方法。

ListBox和ListBoxItem的控件模板在其邊框內具有填充。值得慶幸的是一個ListBoxItem邊框的填充可以通過風格是控制像這樣:

<Style 
     TargetType="ListBoxItem"> 
     <Setter 
      Property="Padding" 
      Value="0" /> 
    </Style> 

,但不幸的是,列表框,你就必須覆蓋其所有細節的默認模板,以改變其內部邊界的硬編碼填充像這樣:

<Style 
     TargetType="ListBox"> 
     <Setter 
      Property="Template"> 
      <Setter.Value> 
       <ControlTemplate 
        TargetType="{x:Type ListBox}"> 
        <Border 
         x:Name="Bd" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         Background="{TemplateBinding Background}" 
         Padding="0" 
         SnapsToDevicePixels="true"> 
         <ScrollViewer 
          Focusable="false" 
          Padding="{TemplateBinding Padding}"> 
          <ItemsPresenter 
           SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
         </ScrollViewer> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger 
          Property="IsEnabled" 
          Value="false"> 
          <Setter 
           Property="Background" 
           TargetName="Bd" 
           Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" /> 
         </Trigger> 
         <Trigger 
          Property="IsGrouping" 
          Value="true"> 
          <Setter 
           Property="ScrollViewer.CanContentScroll" 
           Value="false" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

最後一個注意事項:刪除您在xaml中添加的邊距。

解決方案完成

+0

+1:對於一個很好的解釋 –