Почему Canvas изменяет позицию и размер элементов?

5f5480674ecfa168204352.png
На верхней картинке макет приложения. На нижней запущенное приложение.
Видно, что происходит смещение кнопок вниз и уменьшение размера формы. Для позиционирования использован контейнер Canvas.

Обычно используют другие контейнеры (делят окно Grid). Но это тестовый пример. И, как видно, Canvas работает не корректно - то есть не выполняет свое назначение - жесткое (абсолютное) позиционирование элементов.

Почему Canvas изменяет позицию и размер элементов?

App.xaml (чистый проект без кода и дополнений 1 Canvas и 2 Button )
<Window x:Class="wpf4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:wpf4"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="400" WindowStartupLocation="CenterScreen" ResizeMode="NoResize">
    <Grid>

        <Canvas Background="Green">
            <Button Content="Button" Canvas.Left="10" Canvas.Top="141" Width="75"/>
            <Button Content="Button" Canvas.Left="159" Canvas.Top="94" Width="75"/>
        </Canvas>

    </Grid>
</Window>
  • Вопрос задан
  • 363 просмотра
Решения вопроса 1
logpol32
@logpol32 Автор вопроса
Очень жаль, что никто так и не смог дать полный ответ на мой вопрос. Вопрос достаточно простой.
Ответ был дан на stackoverflow. Напишу его сюда.

Нужно не только указывать размер контейнера (Grid, Canvas как и сказали выше)
Height="420" Width="790"
но указывать "размер" окна как
SizeToContent="WidthAndHeight"
Грубо говоря, окно будет "оборачивать" контейнер (Grid, Canvas). Тогда не будет глюков, смещений и т.д.

Указывать размер окна, как в WinForms, фиксированным
Height="200" Width="400"
не совсем верно. Ведь в WPF этот размер выделен под всё окно. А оно состоит из заголовка, границ, кнопок, иконки. И эти элементы, в зависимости от пользовательских настроек, могут иметь разный размер. И такое окно может смещать/перекрывать контент. Поэтому окно лучше использовать как "обертку" вашего контента.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Janus74
Дизайнер не отображает верхнюю полоску. Сами элементы на своих местах, с заданными размерами. Что бы не ехала разметка, задайте размер Canvas.
5f5499a1294cf207510189.jpeg

На изображение видно, что если задать Canvas размер как у окна, он будет выходить за область окна.

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

По сути, здесь проблема не в дизайнере, а в вашем не понимание того, как он работает. Читайте больше теорий, разбирайте чужой код, и практикуйтесь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы