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