2009-05-08 46 views
50

私はSizeToContent="Height"のWPFウィンドウを持っています。このウィンドウには、最近アクティビティのリストを表示する<Expander />が含まれています。私が望むのは、エキスパンダーを拡大してウィンドウのサイズが比例して大きくなるときです。非表示にすると、ウィンドウは再び比例してサイズが変更されます。ウィンドウがリサイズされている場合は、エキスパンダーとそれに含まれるリストビューは、新しいスペースを使用するために拡大する必要があります。 (私はこれを理解を助けるためにそこに色を気にしない):どのようにWPFウィンドウのサイズを変更した後のエクスパンダでコンテンツのサイズを維持しますか

ノーマルビュー

alt text http://www.deploylx.com/so/wpfexpander/Open.png

は新しいにリサイズ

alt text http://www.deploylx.com/so/wpfexpander/Closed.png

を折りたたみスペース

alt text http://www.deploylx.com/so/wpfexpander/Expanded.png

これまでのところ素晴らしいです。問題は、ウィンドウのサイズを変更した後に<Expander />が折りたたまれているときに発生します。むしろ再び崩壊ウィンドウよりも、リストビューは、単純に隠されている:

は折りたたみサイズ変更

alt text http://www.deploylx.com/so/wpfexpander/Collapsed.png

後、マイ直感は、ウィンドウのサイズが変更する場合、ウィンドウのHeightが設定されていることを私に告げると、したがってSizeToContentプロパティをオーバーライドします。では、サイズを変更した後、サイズをコンテンツの動作に保つためにウィンドウを取得するにはどうすればよいですか?

現在のXAML:

<Window x:Class="DeployLX.Licensing.Nlm.Admin.v3.DashboardWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Dashboard" Width="504" SizeToContent="Height" Height="275"> 

    <DockPanel> 
    <Menu DockPanel.Dock="Top"> 
     <MenuItem Header="_File"> 
     <MenuItem Header="E_xit" Command="{Binding Path=CloseCmd}" /> 
     </MenuItem> 
    </Menu> 
    <Grid DockPanel.Dock="Top" Margin="8" ShowGridLines="True"> 
     <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 

     <Grid Grid.RowSpan="2" Grid.Row="0" Grid.Column="0" Margin="0,0,8,0"> 
     <Rectangle Fill="Red" /> 
     <TextBlock>ActiveCount</TextBlock>   
     </Grid> 

     <Grid Grid.Row="0" Grid.Column="1" Margin="0,0,0,4"> 
     <Rectangle Fill="Green" /> 
     <TextBlock>Authorization</TextBlock> 
     </Grid> 
     <Grid Grid.Row="1" Grid.Column="1" Margin="0,4,0,0"> 
     <Rectangle Fill="Blue" /> 
     <TextBlock>Authorization</TextBlock> 
     </Grid>  
    </Grid> 
    <Expander Header="Recent Activity" Margin="8" IsExpanded="True"> 
     <ListView IsSynchronizedWithCurrentItem="True" MinHeight="100"> 
     <ListView.View> 
      <GridView> 
      <GridViewColumn Header="Status"/> 
      </GridView> 
     </ListView.View> 
     </ListView> 
    </Expander> 
    </DockPanel> 
</Window> 

UPDATE:私はパンダの倒壊イベントに耳を傾け、WindowsのSizeToContentプロパティをリセットしようとしました。これはほとんど動作します。ウィンドウが再び折りたたまれますが、再度展開すると元の100ピクセルの高さに戻ります。この情報を保存してキャプチャすることは可能ですが、ハッキーの匂いとエラーの傾向があります。

答えて

1

my questionで発見したように、HeightをDouble.NaNに設定すると、SizeToContent幸福にリセットされます。私はそれがあなたのエキスパンダーのサイズを覚えているかどうかわからない。 Kent's Resizerコントロールを使用して、サイズ変更の動作をウィンドウを表示するのではなくエキスパンダーに移動することができます。

+0

は、うん... SizeToContentプロパティをリセットすると、同じ基本的な効果がありますが、その後、あなたは展開失います –

+0

Tomが何を意味するのか説明できますか?HeightまたはWidthをDouble.NaNに設定する方法 – DeveloperDan

+0

特定のイベントに反応して、Control.Height = Double.Nanを設定できます。 – Thomas

1

私は

は、最も望ましい解決策...ウィンドウ内の唯一の子としてビューを入れ、その後ビューで私の窓の体を置くとすると、同様の問題を解決することを見つけたが、それはように見えます作業。

57

SizeToContentを使用する場合は、ウィンドウのサイズを変更できないようにする必要があります。また、SizeToContent = "Height"を使用して明示的な高さを設定しないでください。 WPFがウィンドウの高さ、ユーザーの設定、またはコンテンツを信じるべきかどうかを考えてください。 2人の間で前後に切り替えることはできません。

10

対処する最も簡単な方法は、ウィンドウにResizeMode="NoResize"を設定して、手動でサイズを変更することです。 しかしの場合、WindowStyle="None"があると、私はVista Aeroでこれがウィンドウに「クロム」を完全に表示させ、ウィンドウが厄介に見えることに気付きました。また、ユーザーのサイズ変更機能を提供したいと思っているので、これはややこしいものです。 (ユーザーが手動でウィンドウをリサイズしていない限り、エクスパンダ制御を展開するとき1.)エキスパンダーコントロールを折り畳む際には、必ずSizeToContent="Height"をしたい、2)あなたはSizeToContent="Height"をしたいSizeToContent:

問題は、相反する2つの目標を持っているということです= "Manual")、この場合、ユーザーのマニュアルの高さに戻ってください。

Yikes。私はあなたが自分自身で拡大高さを保存することを回避することができるとは思わない。折り畳まれたイベントハンドラのSizeToContent="Height"に戻ってから、拡大するとWPFはユーザーの身長を覚えていません。

2

これはあなたのニーズに合わせなければならない、これを試してみてください: SizeToContent =「WidthAndHeight」高さ=「オート」WIDTH =「オート」

関連する問題