Как вы сохраняете размер окна WPF таким, чтобы он расширялся после изменения размера - PullRequest
52 голосов
/ 09 мая 2009

У меня есть окно 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 модуля развертывания и сбросить свойство Windows SizeToContent. Это почти работает. Это заставит его снова свернуть окно, но при повторном расширении оно вернется к исходной высоте в 100 пикселей. Хотя эту информацию можно хранить и фиксировать, она пахнет хаотично и подвержена ошибкам.

Ответы [ 5 ]

62 голосов
/ 12 июня 2009

Вы должны сделать ваше окно неизменяемым, если вы собираетесь использовать SizeToContent. Кроме того, вы не должны использовать SizeToContent = "Высота", а затем установить явную высоту. Подумайте об этом - какому WPF следует верить в отношении высоты окна, настроек пользователя или содержимого? Он не может просто переключаться между двумя.

11 голосов
/ 17 июля 2009

Самый простой способ справиться с этим - вывести ручное изменение размера из уравнения, установив ResizeMode="NoResize" в окне. Однако , если у вас есть WindowStyle="None" Я заметил, что в Vista Aero это приводит к тому, что окно полностью теряет «хром», и окно выглядит неловко. Кроме того, это отчасти похоже на коп, поскольку похоже, что вы хотите предоставить пользователю возможности изменения размера.

Проблема в том, что у вас две противоречивые цели: 1.) вы всегда хотите SizeToContent="Height" при свертывании элемента управления экспандером, 2.) вы хотите SizeToContent="Height" при расширении элемента управления экспандером , если пользователь изменил размер окна вручную (SizeToContent = "Manual"), в этом случае вы хотите вернуться к ручной высоте пользователя.

Хлоп. Я не думаю, что вы можете обойтись, сохраняя расширенную высоту самостоятельно. WPF не будет помнить ручную высоту пользователя при увеличении, как только вы вернетесь к SizeToContent="Height" в обработчике свернутых событий.

3 голосов
/ 15 июля 2016

Попробуйте, это должно соответствовать вашим потребностям: SizeToContent = "WidthAndHeight" Height = "Auto" Width = "Auto"

1 голос
/ 12 июня 2009

Я обнаружил, что размещение тела моего окна в представлении, а затем помещение представления в качестве единственного дочернего элемента в окне решило аналогичные проблемы ...

Не самое желаемое решение, но, похоже, оно работает.

1 голос
/ 09 мая 2009

Как я обнаружил в моем вопросе , установка высоты на Double.NaN приводит к его сбросу на SizeToContent счастья. Я не знаю, запомнит ли он размер вашего расширителя. Вы можете использовать элемент управления Resizer в Kent, чтобы переместить поведение размеров в расширитель, а не в содержащее окно.

...