Дочерний элемент не отображается в ожидаемой позиции DockPanel

У меня есть окно с DockPanel, а внутри DockPanel есть два пользовательских элемента управления. Как я и ожидал, пользовательский элемент управления «заголовок» закреплен в верхней части окна. Однако пользовательский элемент управления «нижний колонтитул» не закрепляется в самом низу окна, а вместо этого, кажется, стыкуется примерно на 500 пикселей ниже заголовка. Может быть, есть еще 300 пикселей (я просто догадываюсь по тому, где он появляется в окне) под «нижним колонтитулом» просто пустого места.

Элемент управления header имеет DesignHeight, равный 100, а элемент управления нижнего колонтитула - DesignHeight, равный 20.

Почему нижний колонтитул не закрепляется в самом низу окна?

Код MainWindow.xaml:

<Window x:Class="RATTA.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="clr-namespace:RATTA.ViewModel"
        xmlns:vw="clr-namespace:RATTA.View"
        Title="RATTA" Height="800" Width="600" Background="WhiteSmoke">

        <DockPanel Width="Auto" Height="Auto" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">

            <vw:HeaderVw DataContext="MainHeaderVM" DockPanel.Dock="Top" />

            <vw:FooterVw DataContext="MainFooterVM" DockPanel.Dock="Bottom" />

        </DockPanel>
</Window>

person Jagd    schedule 04.06.2015    source источник


Ответы (1)


Свойство DockPanel.Dock для последнего дочернего элемента в DockPanel ничего не делает, потому что для свойства DockPanel LastChildFill по умолчанию установлено значение true. Следовательно, не имеет значения, какое свойство DockPanel.Dock вы назначаете - если это последний дочерний элемент, он заполнит оставшуюся часть DockPanel.

Причина, по которой он кажется примерно 300 пикселей от заголовка и нижней части окна, заключается в том, что когда последний дочерний элемент заполняется, если высота последнего дочернего элемента явно установлена, он будет находиться в центре оставшегося пространства.

Есть несколько решений, которые зависят от ваших дизайнерских замыслов.

  • Поместите другой объект после нижнего колонтитула (например, сетку). Это типичное использование DockPanel - панели инструментов, строки состояния, меню и т. Д. Закрепляются первыми, а основное содержимое представления - это последний объект в DockPanel (он заполняет оставшееся пространство).
  • Поместите нижний колонтитул перед заголовком. Это приведет к тому, что нижний колонтитул будет закреплен первым, а верхний колонтитул заполнит остаток, что может быть тем, что вы хотите сделать.
  • В качестве альтернативы установите для LastChildFill DockPanel значение false. Это приведет к тому, что ваши закрепленные объекты будут вести себя правильно, но оставшееся пространство в DockPanel не будет заполнено, если вы добавите к нему еще один объект.
  • Используйте другой элемент управления. Сетка также может быть подходящим элементом управления - 3 строки, первая с высотой Auto, вторая без указанной высоты (или высотой * или 1 *, если вы хотите быть явной), а третья с высотой Авто.
person learningcs    schedule 05.06.2015
comment
Идеально! Спасибо за информацию о свойстве LastChildFill. Я видел и читал об этом, но не понимал, что это будет иметь приоритет над свойством Dock в последнем дочернем элементе. Большое спасибо за помощь. - person Jagd; 05.06.2015