2017-09-18 43 views
0

現在、辞書(それ自体は辞書自体で保持されている)を表示しようとしています。WPF ListView個々の高さで表示される項目

最初はUniformGridをItemsPanelTemplateとして使用していましたが、表示するアイテムは個別の高さを持つことができました。

私はUniformGridを使ってすべてのコンテンツを表示できますが、GridまたはStackPanelをItemsPanelTemplateとして使用することはできません。

下のコードは、各操作ブロックに高さは可変ですが、同じ操作高さが与えられているという欠点があります。 私は、StackPanelを使うのが最善だと結論づけた後、オペレーションは必要な高さになるように表示されます。しかし、私が試したとき、彼らはListViewの高さのほんの一部を取ることを再確認しました。

ワース: Operation-UserControl自体は高さを評価し、それに応じてレイアウトを構築します。したがって、すべてのコンテンツを表示するのに必要なスペースは必要ありませんが、使用可能なスペースに収まるコンテンツが表示されます。

ListViewItems(= operations)がListViewのフルハイトをとるようにするにはどうすればよいですか?

EDIT:明確化
説明行動がどのような制御を述べたが、他は私に知らせて、必要なfuntionalityを提供できるとできない場合...

EDIT2:いくつかの例
が利用可能な全スペース:500
スクロールバーがありません。
追記:そこにはmaxItemLimitはありませんが、それはITEMCOUNT個が10

考える1項目超えてしまう可能性は非常に低いです:(すべてのコンテンツ300を表示するために必要なスペースを)
この単一の項目はかかるだろう300


:10個の項目を考えると150、200
(おそらく唯一のStackPanelでの作業。)

:(これらはスペースの150と200が必要になります)
どちらのアイテムがフルサイズで表示されます:2つの項目を考えます これらの10は、500で完全に望ましいサイズに均等にまたは相対的に絞り込まれます(1アイテムあたり50個)。
両方の動作は問題ありません。

UniformGrid vs StackPanel

<UserControl x:Name="vDay" x:Class="RefServiceClient.Day" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:RefServiceClient" 
     mc:Ignorable="d" 
     d:DesignHeight="60" d:DesignWidth="120" 
     MinHeight="40"> 

<Grid x:Name="gridDay" 
     Width="{Binding ActualWidth, ElementName=vDay, Mode=OneWay}" 
     Height="{Binding ActualHeight, ElementName=vDay, Mode=OneWay}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <Grid x:Name="DayHeader" Grid.Row="0"> 
     <!--containing header info: several textboxes, which are irrelevant for the question--> 

     <TextBox x:Name="dayShortname" 
       Grid.Row="0" Grid.Column="1" 
       VerticalAlignment="Center" 
       HorizontalAlignment="Stretch" 
       Margin="1" 
       Text="{Binding Path=Value.DayShortname}"/> 
    </Grid> 

    <ListView x:Name="operations" Grid.Row="1" Background="Aqua" 
       ItemsSource="{Binding Path=Value.OperationList}" 
       HorizontalAlignment="Stretch" 
       VerticalAlignment="Stretch" 
       HorizontalContentAlignment="Stretch" 
       VerticalContentAlignment="Stretch" 
       ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
       ScrollViewer.VerticalScrollBarVisibility="Disabled"> 

     <ListView.ItemTemplate> 
      <DataTemplate> 
       <local:Operation Background="Crimson" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch"/> 
       <!--<local:Operation Background="Crimson" />--> 
      </DataTemplate> 
     </ListView.ItemTemplate> 

     <ListView.ItemsPanel> 
      <ItemsPanelTemplate> 

       <!--<Grid Grid.IsSharedSizeScope="True"/>--> 
       <!--<StackPanel/>--> 
       <!--<VirtualizingStackPanel Orientation="Vertical"/>--> 
       <UniformGrid Columns="1"/> 
      </ItemsPanelTemplate> 
     </ListView.ItemsPanel> 
    </ListView> 

</Grid> 

+0

問題はあなたの 'local:Operation'実装だと思います。適切な高さが要求される場合、itemsPanelとして 'StackPanel'を持つ' ListView'は、各リスト項目に適切なスペースを与えます。 – grek40

+0

@ grek40私はあなたにそこに従うことができます。しかしListViewは複数の 'local:Operation'を保持することができ、利用可能な総スペースは同じであると私の意見では1つの解決策しかありません: ' local:Operations'は最小限のコンテンツ(header-data)使用可能なスペースがある場合は詳細データを表示します。 それ以外の場合(操作が常に必要なスペースを取る場合)、スクロールバーなしですべての「操作」を表示することはできません。 – Evaniar

+1

'UserControl'の代わりに' StackPanel'を使って 'DataTemplate'を使ってみましたか? – XAMlMAX

答えて

0

あなたのルールに従ってアイテムを配置するカスタムパネルを作成することができます。それで、あなたは彼らが取ることが許されるどんなサイズでもうまく表示するようにあなたのアイテムをデザインしなければなりません。次のようにパネルの

ラフスケッチを見ることができる:

public class SqueezeStackPanel : Panel 
{ 
    protected override Size MeasureOverride(Size availableSize) 
    { 
     var desiredHeight = 0.0; 
     foreach (UIElement child in InternalChildren) 
     { 
      child.Measure(availableSize); 
      desiredHeight += child.DesiredSize.Height; 
     } 

     if (availableSize.Height < desiredHeight) 
     { 
      // we will never go out of bounds 
      return availableSize; 
     } 
     return new Size(availableSize.Width, desiredHeight); 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     // measure desired heights of children in case of unconstrained height 
     var size = MeasureOverride(new Size(finalSize.Width, double.PositiveInfinity)); 

     var startHeight = 0.0; 
     var squeezeFactor = 1.0; 
     // adjust the desired item height to the available height 
     if (finalSize.Height < size.Height) 
     { 
      squeezeFactor = finalSize.Height/size.Height; 
     } 

     foreach (UIElement child in InternalChildren) 
     { 
      var allowedHeight = child.DesiredSize.Height * squeezeFactor; 
      var area = new Rect(new Point(0, startHeight), new Size(finalSize.Width, allowedHeight)); 
      child.Arrange(area); 
      startHeight += allowedHeight; 
     } 

     return new Size(finalSize.Width, startHeight); 
    } 
} 

をこのパネルが無効にスクロールバーを使用してListViewItemsPanelTemplateで使用することができます。

+0

これまでのところ感謝します。私はそれを(多分СергейБоголюбовの提案と一緒に)試みて、報告します。 – Evaniar

+0

正しい方向に私を指差してくれてありがとう再び – Evaniar

0

です。私はあなたにオプションを与えます。最初。たとえば、Boolean AttachedPropertyを実装して、この特定のインスタンスが特定のサイズかどうかをマークします。 0/1で十分でない場合は、適切な列挙を宣言します。二番目。既存のStackPanelを拡張し、適切な保護されたメンバーをオーバーライドします。少なくとも、MeasureOverride/ArrangeOverride。ここで、対応する添付プロパティの値を読み取り、それがどれだけ大きくて小さくてもよいかを判断できます。それは解決策のように聞こえるか?場合には、私はいくつかの例を提供することができます。

+0

step1でオブジェクトを参照していますか? ListViewまたはChildElement(= Operation)? それ以外は、grek40のような同様のソリューションを提案します。 Panelの代わりにStackPanelを拡張するだけです。 Panelの代わりにStackPanelを拡張する利点は何ですか? – Evaniar

関連する問題