Самый простой способ, который я нашел, - указать окну размер его содержимого:
<Window ... SizeToContent="WidthAndHeight" ...>
, а затем, как только будет выполнено изменение размера (которое будет учитывать MinWidth и MinHeight дочерних элементов), запустите некоторый код, который устанавливает MinWidth и MinHeight для ActualWidth и ActualHeight окна. Также рекомендуется отключить SizeToContent, чтобы размер окна не изменялся при изменении его содержимого.
Следующий вопрос: куда поместить этот код? Я наконец остановился на OnSourceInitialized:
protected override void OnSourceInitialized(EventArgs e)
{
base.OnSourceInitialized(e);
MinWidth = ActualWidth;
MinHeight = ActualHeight;
ClearValue(SizeToContentProperty);
}
Я также пробовал событие Loaded, но в моем случае это было слишком рано - Loaded происходит до того, как привязки данных были оценены, и у меня были привязки данных, которые повлияли на мой макет (метка с привязкой для его содержимого - его размер изменилось после вступления в силу привязки). Перемещение кода в OnSourceInitialized, который срабатывает после привязки данных, устранил проблему.
(были также другие события, которые запускались после привязки, но до того, как было показано окно - SizeChanged и LayoutUpdated - но они оба запускаются несколько раз, как показано в окне, и снова позже, если пользователь изменяет размер окна; OnSourceInitialized только один раз, что я считаю идеальным.)