Переопределение размера пользовательского элемента управления WPF - PullRequest
1 голос
/ 03 ноября 2010

Я создаю пользовательский элемент управления WPF, производный от Grid. Это шахматная доска, и поэтому я хочу, чтобы ее ширина соответствовала ее высоте. Как мне это сделать?

Edit:

Я попробовал следующее.

private void cbcBoard_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        if (e.NewSize.Width != e.NewSize.Height)
        {
            double m = Math.Min(e.NewSize.Width, e.NewSize.Height);

            cbcBoard.Width = m;
            cbcBoard.Height = m;
        }
    }

Это не сработало. Есть идеи?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 04 ноября 2010

Я думаю, что самое простое решение - установить размер вашего UserControl равным некоторому постоянному значению, где Height == Width, а затем отбросить все это в Viewbox, который будет обрабатывать масштабирование (при сохранении соотношения сторон) дляyou:

<Viewbox>
    <myLib:UserControl1 x:Name="userControl11" />
</Viewbox>

Это означает, что ваш элемент управления будет 'растянутым' , а не изменен в размерах, что может сделать его неприемлемым для вас, но его легко реализовать!

2 голосов
/ 03 ноября 2010

Новое решение / обходной путь.UserControl может оставаться как есть, мы оставим масштабирование родительскому контейнеру.

Мы не можем выполнить Min (Width, Height) только с помощью UserControl, потому что, если мы установим для него Height, тогда родительский контейнер не будет масштабировать его по вертикали, и то же самое касается Width.Если мы пытаемся манипулировать ими, то возникают ситуации, когда мы заканчиваем бесконечный цикл изменения ширины / высоты.

Нам нужен еще один скрытый элемент управления в том же пространстве, который полностью заполняет его и может сообщать нам, каковы его ширина и высота при каждом изменении.Тогда мы можем использовать решение Math.Min (Ширина, Высота).Что-то вроде этого.Обратите внимание, как оба элемента управления находятся в Grid.Row = "1" и Grid.Column = "1".

<Rectangle Name="availableSpace"
           SizeChanged="availableSpace_SizeChanged"
           Fill="Transparent"
           Grid.Row="1"
           Grid.Column="1"/>
<myLib:UserControl1 x:Name="userControl11"
                    Grid.Row="1"
                    Grid.Column="1"
                    HorizontalAlignment="Left"
                    VerticalAlignment="Top"/>

А затем в доступномSpace_SizeChanged EventHandler

private void availableSpace_SizeChanged(object sender, SizeChangedEventArgs e)
{
    double minValue = Math.Min(availableSpace.ActualWidth, availableSpace.ActualHeight);
    userControl1.Width = minValue;
    userControl1.Height = minValue;
}

Теперь у нас есть 1Соотношение UserControl: 1 и масштабируется по вертикали и горизонтали

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...