Я знаю, что для Window
(фактически любого FrameworkElement
) можно указать MinWidth
и MinHeight
. Мне интересно, как я могу сделать так, чтобы этот минимум соответствовал DesiredSize
окна?
Другими словами, я хочу сказать "Вы можете изменить размер этого окна настолько, насколько хотите, но не меньше, чем минимум, необходимый для отображения его содержимого".
Например, скажем, у меня есть простой Window
, содержащий DockPanel
с тремя элементами, расположенными вертикально. Для простоты мы будем говорить только о высоте.
Первый — это
Rectangle
сHeight
из 20, он закреплен сверху, так что егоDesiredSize.Height
равно 20.Второй —
Label
, который имеетMinHeight
из 20 и закреплен внизу, но может увеличиваться в высоту, если есть несколько строк текста. (В настоящее время есть только одно слово, поэтомуDesiredSize.Height
также равно 20)Третий элемент — это настраиваемый элемент управления
ImageViewer
, который заполняет оставшуюся область в середине, но никогда не будет меньше своего содержимого плюс отступы. В настоящее время изображение имеет размер 15x15, а отступ — 2,5 на стороне, поэтому егоDesiredSize.Height
равно 20 (2,5 + 15 + 2,5).
Таким образом, с учетом вышеизложенного DesiredSize.Height
для StackPanel будет равно 60 (20 + 20 + 20), а DesiredSize.Height
для Window
будет равно 60 + высота его собственного хрома (скажем так, это тоже 20), и это кажется дайте мне Window.DesiredSize.Height
из 80. Это то, что мне нужно для MinHeight окна.
Я пытался привязать MinHeight
Window
к его DesiredSize.Height
через SizeToDoubleConverter
(для определения возврата Width
или Height
соответственно требуется Dimension
), но это не дало никакого эффекта.
Это выглядит многообещающе...
protected override Size MeasureOverride(Size availableSize) {
var desiredSize = base.MeasureOverride(availableSize);
MinWidth = Math.Ceiling(DesiredSize.Width);
MinHeight = Math.Ceiling(DesiredSize.Height);
return desiredSize;
}
Примечание. Я обычно использую Math.Ceiling
вместо фактического DesiredSize.Height
, потому что обычно это дробь, и при выравнивании по пикселям устройства макет будет сбит, что приведет к путанице.
Вышеприведенное близко к работе, но вы столкнетесь с проблемами, если захотите также установить MaxHeight
равным ему (например, чтобы разрешить горизонтальный, но не вертикальный размер).
Это легко сделать с помощью AutoLayout в iOS/macOS, но я не уверен, как это сделать в WPF, даже программно. Я просто должен продолжать гадать, какой размер выглядит лучше всего.
MinHeight
на60
(илиStackPanel.ActualHeight
). Или обработать событиеSizeChanged
? - person mm8   schedule 16.08.2018Content
. ИUIElement
имеет свойствоActualHeight
. Или какой высоты вы хотите? - person mm8   schedule 16.08.2018MinWidth
доDesiredSize.Width
и отMinHeight
доDesiredSize.Height
, чтобы окно никогда не было меньше, чем наименьшее допустимое содержимое, которое оно может иметь. Есть смысл? - person Mark A. Donohoe   schedule 16.08.2018