Как вы можете масштабировать элементы XAML в соответствии с их контейнерами? - PullRequest
0 голосов
/ 25 мая 2018

Я понимаю, что существует множество способов определения размера дочерних элементов в соответствии с родительскими элементами.Например, если вы используете сетку, вы можете использовать определения строк и столбцов, и вы получите большую свободу в отношении автоматических размеров или фиксированных размеров или «звездных» размеров.Однако, если сами дочерние элементы имеют фиксированную ширину и высоту, то не имеет значения, если родитель говорит дочернему элементу заполнить все доступное пространство.Дочерний элемент останется того же размера.

У меня есть окно, которое было разработано так, чтобы всегда отображать его содержимое с одинаковыми размерами в пикселях, независимо от того, к какому размеру оно изменено.Вместо того, чтобы идти и изменять каждый дочерний элемент на каждой странице XAML, чтобы он не имел фиксированного размера, я бы хотел, чтобы основной Grid просто масштабировался, чтобы соответствовать окну.Пока что единственный способ получить элементы с фиксированными размерами для отображения в разных размерах - это использовать масштабирование Transform, либо с RenderTransform или LayoutTransform.Но если я пойду по этому пути, мне придется кодировать масштабирование в C #, чтобы отвечать на события изменения размера, а не делать это автоматически.Есть ли какой-нибудь встроенный способ сделать это в XAML?Это похоже на то, что я мог бы сделать с каким-то специальным свойством, или, возможно, ContentControl или ContentPresenter.

Я видел Изменение размера окна WPF и содержимого, зависящего от экранаразрешение , но он требует обычного изменения размера, а не масштабирования фиксированных элементов.Я также видел Как сделать так, чтобы все элементы управления соответственно пропорционально изменяли размеры при увеличении окна? , и это имеет ту же проблему, хотя второй ответ по крайней мере говорит об обработке событий изменения размера.

Вотупрощенный пример дочернего элемента фиксированного размера, размер которого не изменяется должным образом:

<Window x:Class="WpfTest.Window1"
        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"
        mc:Ignorable="d"
        Title="Window1" Height="200" Width="300" Background="LightBlue">
    <Grid>
        <Frame Background="Blue" Width="200" Height="100">

        </Frame>
    </Grid>
</Window>

Фактические результаты:

Blue rectangle that's always the same size

Желаемые результаты:

Blue rectangle that scales to fill its window

Как вы видите, я ищу эффект почтового ящика, то есть я хочу, чтобы соотношение сторон сохранялось.Однако я не нашел способа получить автоматическое масштабирование, даже не беспокоясь о соотношении сторон, поэтому я подумал, что буду рассматривать почтовый ящик как своего рода второй этап, о котором я буду беспокоиться позже.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Другой вариант - использовать MultiValueConverter для установки высоты и ширины.Вы могли бы дать конвертеру ActualWidth и ActualHeight корневого контейнера все параметры и позволить ему вычислить необходимое соотношение сторон.

Учебное пособие, описывающее MultiValueConverter: http://www.wpftricks.com/2017/05/wpf-multivalueconverter.html

0 голосов
/ 25 мая 2018

Элемент управления, который вы ищете, является Viewbox.Он увеличивается, чтобы заполнить свой контейнер (вы можете установить стиль растягивания для почтового ящика) и соответствующим образом масштабировать все его содержимое.Просто сделайте его корневым элементом вашего приложения (или что-то, что вы хотите растянуть):

<Viewbox>
    <Grid> //Or whatever
         <OtherStuff>
    </Grid>
</Viewbox>

Обратите внимание, что, поскольку окно просмотра масштабирует свое содержимое, традиционное поведение Grid и подобное перестанут работать так как размер содержимого фактически никогда не изменяется.

...