Подтвердить что ты не робот

Как сохранить размер окна WPF на контент с помощью Expander после изменения размера

У меня есть окно WPF с SizeToContent="Height". Это окно содержит <Expander />, в котором отображается список последних действий. Я бы хотел, чтобы при расширении расширителя размер окна увеличивался пропорционально. При скрытии окно снова пропорционально изменяется. Если размер окна изменен, расширитель и он должен содержать список, чтобы использовать новое пространство. (не против цветов там, чтобы помочь мне понять это):

Обычный вид

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>

ОБНОВЛЕНИЕ:. Я пробовал прослушивать событие Collapsed расширителя и сбросить свойство Windows SizeToContent. Это почти работает. Это заставит его снова свернуть окно, но при его расширении оно возвращается к исходной высоте 100 пикселей. Хотя это возможно хранить и захватывать эту информацию, она пахнет хаки и подвержена ошибкам.

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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