2017-03-23 3 views
1

コンテンツがテーブルのようなものであるユーザーコントロールがあります。 XAMLを見ると、MainGridは実際には 'テーブル'を表しています。WPFはコンテンツが小さい場合にはスペースよりも少なくなります

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="150"/> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    ... 

    <ScrollViewer AutomationProperties.AutomationId="SchedulerScrolViewer" Grid.Row="1" Grid.Column="1" HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Visible" VerticalAlignment="Stretch"> 
     <Grid x:Name="MainGrid" /> 
    </ScrollViewer> 

私が例えば100行と100列を持つことができるのでMainGridは、スクロールビューアであり、その場合のコードはうまく動作します。 しかし、次のケースを考慮してください。

利用可能なウィンドウの高さは、たとえば500ピクセルです。メイングリッドでは、高さが25の2つの行があります。そのため、私のMainGridは50ピクセル(25,25)しか使用しませんし、450ピクセルは使用しないことを望みます。

<RowDefinition Height="*" />のため、私は実際にそのMainGridが500ピクセル(25,475)を取ることになります。どのように私はそのような行動を変えることができますか?

は、私のような何かについて考え、この

<Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="{Binding CalculatedHeight}" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="150"/> 
     <ColumnDefinition Width="{Binding CalculatedWidth}" /> 
    </Grid.ColumnDefinitions> 
CalculatedHeightは、次の方法

if(content height > main grid actual height) 
{ 
    CalculatedHeight = main grid actual height; // I need scroll viewer 
} 
else 
{ 
    CalculatedHeight = content height; 
} 

にしかし、その場合に算出されます

、私はパンダが展開されている場合、私はあまり持って(ウィンドウパンダを見守る必要がありますスペースなど)、サイズ変更など、私はそれが良い方法であるかどうかはわかりません。

もし私が<RowDefinition Height="Auto" />を設定すると、Autoは、その中の要素の高さと同じ高さが与えられているため、スクロールビューアは機能しません。

これを実装する方法はありますか?私は本当に簡単な解決策を見つける

<Grid x:Name="OuterGrid"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="*" MaxHeight="{Binding ElementName=InnerGrid, Path=ActualHeight, FallbackValue=1}" /> 
    </Grid.RowDefinitions> 
    <TextBlock Grid.Row="0">sdfsdfs</TextBlock> 
    <ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Visible"> 
     <Grid x:Name="InnerGrid" Height="Auto"> 
      <TextBlock> 
       jhdsfksjdhf 
       <LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /><LineBreak /> 
      </TextBlock> 
     </Grid> 
    </ScrollViewer> 
</Grid> 

FallBackValueは、初期の高さのために必要とされる...

+0

ScrollViewerの高さを50に設定し、2番目のRowDefinitionの高さをAuto(または50)に設定するとどうなりますか? – mm8

+0

しかし、ウィンドウのサイズ変更やエキスパンダーの展開に問題があります。 – gzsun

+0

質問をするときに問題の完全なレポを提供してください:https://stackoverflow.com/help/mcve – mm8

答えて

1

はこれを試してみてください。重要な部分はVerticalAlignment = "Top"です。

<Grid> 
<Grid.RowDefinitions> 
    <RowDefinition Height="Auto" /> 
    <RowDefinition Height="*" /> 
</Grid.RowDefinitions> 

<TextBlock Grid.Row="0">...</TextBlock> 

<ScrollViewer Grid.Row="1" VerticalScrollBarVisibility="Visible"> 
    <Grid x:Name="MainGrid" VerticalAlignment="Top" /> 
</ScrollViewer> 
</Grid> 
+0

ありがとうございました!私も別の解決策を見つけるので、あなたが好奇心があったら、答えを見てください。 – gzsun

関連する問題