56

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

通常表示

代替テキスト http://www.deploylx.com/so/wpfexpander/Open.png

折りたたまれた

代替テキスト http://www.deploylx.com/so/wpfexpander/Closed.png

新しいスペースにサイズ変更

代替テキスト http://www.deploylx.com/so/wpfexpander/Expanded.png

これまでのところ、これはうまく機能します。<Expander />ウィンドウのサイズを変更した後に が折りたたまれたときに問題が発生します。ウィンドウが再び折りたたまれるのではなく、リスト ビューが単に非表示になります。

サイズ変更後に折りたたまれました

代替テキスト 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>

更新:エキスパンダーの Collapsed イベントをリッスンして、WindowsSizeToContentプロパティをリセットしようとしました。これはほとんど機能します。ウィンドウが再び折りたたまれますが、再度展開すると元の 100 ピクセルの高さに戻ります。この情報を保存してキャプチャすることは可能ですが、ハッキングの匂いがし、エラーが発生しやすくなります。

4

5 に答える 5

66

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

于 2009-06-11T22:26:57.383 に答える
11

ResizeMode="NoResize"対処する最も簡単な方法は、ウィンドウ で設定することにより、方程式から手動のサイズ変更を取り除くことです。ただしWindowStyle="None"Vista Aero では、これによりウィンドウの「クロム」が完全に脱落し、ウィンドウがぎこちなく見えることに気付きました。また、ユーザーにサイズ変更機能を提供したいように見えるので、これはやや面倒です。

問題は、競合する 2 つの目標があることです。1.)SizeToContent="Height"エキスパンダー コントロールを折りたたむときは常に必要であり、2.)ユーザーが手動でウィンドウのサイズを変更 (SizeToContent="Manual") しない限りSizeToContent="Height"、エキスパンダー コントロールを展開するときに必要です。取扱説明書の高さに戻したい場合。

うわぁ。拡張された高さを自分で保存することはできないと思います。SizeToContent="Height"WPF は、折りたたまれたイベント ハンドラーに戻った後、展開時にユーザーの手動の高さを覚えていません。

于 2009-07-17T11:30:03.767 に答える
10

これを試してください、それはあなたのニーズに合うはずです:

<Window ...
        SizeToContent="WidthAndHeight"  
        Height="Auto" 
        Width="Auto">
于 2016-07-15T09:52:05.110 に答える
2

ウィンドウの本体をビューに配置し、ビューをウィンドウの唯一の子として配置すると、同様の問題が解決することがわかりました...

最も望ましい解決策ではありませんが、うまくいくようです。

于 2009-06-11T22:17:24.583 に答える
1

私の質問で発見したように、Height を Double.NaN に設定すると、SizeToContent の幸せにリセットされます。ただし、エキスパンダーのサイズを覚えているかどうかはわかりません。Kent の Resizer コントロールを試して、サイズ変更動作をウィンドウではなくエキスパンダーに移動してみてください。

于 2009-05-09T04:51:43.300 に答える