2016-12-04 46 views
0

我有以下CntrolTemplate有一個HierarchicalDataTemplate顯示我有一個自定義的數據類型。它只是一個帶有一個顯示按鈕和文本的stackPanel的ItemsControl。ItemsControl不包裝物品到下一行

我遇到的問題是,內容並不環繞,並轉到下一行時增加了很多項目:

<ControlTemplate x:Key="MyControlTemplate"> 
    <StackPanel x:Name="MyStackPanel" Orientation="Horizontal" Width="Auto" Margin="0,1,0,1" Background="{x:Null}"> 
     <ItemsControl x:Name="MyItemsControl" Margin="5,0,5,0" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyClass}}, Path=ItemsSource}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" IsItemsHost="True"> 
         <StackPanel.Resources> 
          <BooleanToVisibilityConverter x:Key="BoolToVisibility"/> 
          <HierarchicalDataTemplate DataType="{x:Type local:MyCustomDataType}"> 
           <Button Height="24" MinWidth="16" Width="Auto" Command="{Binding}" Visibility="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"           
             Background="Transparent" BorderBrush="Transparent"> 
            <StackPanel Orientation="Horizontal" Height="22" VerticalAlignment="Center"> 
             <Image Height="Auto" Width="Auto" Stretch="Uniform" Source="{Binding Path=IconSource}" 
               Visibility="{Binding Path=HideInTileGroup, Converter={StaticResource BoolToVisibility}}" Margin="2" VerticalAlignment="Center"/> 
             <TextBlock Text="{Binding Path=DisplayName}" VerticalAlignment="Center" Width="Auto" 
                Foreground="{Binding Path=DisplayBrush}" 
                Visibility="{Binding Path=ShowDisplayName, Converter={StaticResource BoolToVisibility}}" FontSize="12"> 
             </TextBlock> 
            </StackPanel> 
           </Button> 
          </HierarchicalDataTemplate> 
         </StackPanel.Resources> 
        </StackPanel> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
     </ItemsControl> 
    </StackPanel> 
</ControlTemplate> 

我怎樣才能使它環繞?

編輯:

我把它改成一個WrapPanel像這樣但還是不換行。

<ControlTemplate x:Key="MyControlTemplate"> 
<StackPanel x:Name="MyStackPanel" Orientation="Horizontal" Width="Auto" Margin="0,1,0,1" Background="{x:Null}"> 
    <ItemsControl x:Name="MyItemsControl" Margin="5,0,5,0" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MyClass}}, Path=ItemsSource}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel> 
        <WrapPanel.Resources> 
         <BooleanToVisibilityConverter x:Key="BoolToVisibility"/> 
         <HierarchicalDataTemplate DataType="{x:Type local:MyCustomDataType}"> 
          <Button Height="24" MinWidth="16" Width="Auto" Command="{Binding}" Visibility="{Binding RelativeSource={RelativeSource Self}, Path=IsEnabled, Converter={StaticResource BoolToVisibility}}"           
            Background="Transparent" BorderBrush="Transparent"> 
           <StackPanel Orientation="Horizontal" Height="22" VerticalAlignment="Center"> 
            <Image Height="Auto" Width="Auto" Stretch="Uniform" Source="{Binding Path=IconSource}" 
              Visibility="{Binding Path=HideInTileGroup, Converter={StaticResource BoolToVisibility}}" Margin="2" VerticalAlignment="Center"/> 
            <TextBlock Text="{Binding Path=DisplayName}" VerticalAlignment="Center" Width="Auto" 
               Foreground="{Binding Path=DisplayBrush}" 
               Visibility="{Binding Path=ShowDisplayName, Converter={StaticResource BoolToVisibility}}" FontSize="12"> 
            </TextBlock> 
           </StackPanel> 
          </Button> 
         </HierarchicalDataTemplate> 
        </WrapPanel.Resources>        
       </WrapPanel> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
</StackPanel> 

+0

使用WrapPanel而不是StackPanel? – Clemens

+0

所以我的外層StackPanel是一個WrapPanel?是否保持內部ItemsControl相同? –

+0

我的意思是ItemsPanel。 – Clemens

回答

1

如果改變ItemsPanelWrapPanel沒有奏效,那是因爲你還有一個外StackPanel

<ControlTemplate x:Key="MyControlTemplate"> 
    <StackPanel x:Name="MyStackPanel" Orientation="Horizontal" Width="Auto" Margin="0,1,0,1" Background="{x:Null}"> 

這意味着ItemsPanel仍然認爲它具有無限的寬度處理所以不會實際包裝。

將外層StackPanel完全移除,將其替換爲其他容器或限制其寬度。我的代碼中沒有看到任何內容,它告訴我你需要這個外部容器,所以我只是簡單地刪除它並從那裏出去。

如果它仍然沒有包裝,那麼仍然必須有另一個「無限寬度」(即增長到適合其內容的容器)容器在視覺樹中的某處。你需要從這個項目向外工作,直到你找到它。

+0

我將外部堆疊面板的寬度和高度設置爲800,並且不包裹它只是限制它可以適應寬度800的圖像數量。我還移除了外部堆疊面板,但它仍未包裹。我是否需要用另一個容器替換它? –

+1

@HarryBoy我會說你不需要用另一個容器替換它 - 至少從你發佈的代碼中。如果要顯示幾個「事物」,則只需要容器。如果它仍然沒有包裝,那麼仍然必須有另一個「無限寬度」(即一個長度適合其內容的容器)容器在視覺樹中的某處。 – ChrisF