Соотношение сторон окна WPF - PullRequest
0 голосов
/ 22 июня 2010

Мне интересно, как сохранить соотношение сторон (т.е. 16x9) окна в WPF при изменении размера - если это возможно таким образом, чтобы использовать MVVM. Поскольку я новичок в MVVM и WPF, я не уверен, с чего начать. Спасибо.

1 Ответ

1 голос
/ 22 июня 2010

Это может быть трудно сделать с «чистой» реализацией MVVM, потому что вам нужно знать, в каком направлении произошло изменение размера (по горизонтали или по вертикали).Обратите внимание, что если оба изменяются одновременно (т. Е. Пользователь изменяет размер, перетаскивая угол), вам нужно будет решить, какой из них использовать.

В вашей ViewModel у вас, вероятно, будет свойство AspectRatio.

В вашем View вы, скорее всего, переопределите событие OnRenderSizeChanged.В этом случае дело вкуса, выполняете ли вы работу в представлении, используя свойство из ViewModel, или передаете значение свойству в ViewModel, чтобы выполнить работу, и связываетесь с новыми значениями.

Пример 1: Выполните работу здесь

protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
    if (sizeInfo.WidthChanged)
    {
        this.Width = sizeInfo.NewSize.Height * mViewModel.AspectRatio;
    }
    else
    {
        this.Height = sizeInfo.NewSize.Width * mViewModel.AspectRatio;
    }
}

Пример 2: Выполните работу в ViewModel

View.xaml.cs
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
{
    if (sizeInfo.WidthChanged)
    {
        viewModel.AspectWidth = sizeInfo.NewSize.Width;
    }
    else
    {
        viewModel.AspectHeight = sizeInfo.NewSize.Height;
    }
}

ViewModel.cs
public Double AspectWidth
{
    get { return mAspectWidth; }
    set
    {
        // Some method that sets your property and implements INotifyPropertyChanged
        SetValue("AspectWidth", ref mAspectWidth, value);
        SetValue("AspectHeight", ref mAspectHeight, mAspectWidth * mAspectRatio);
    }
}

public Double AspectHeight
{
    get { return mAspectHeight; }
    set
    {
        // Some method that sets your property and implements INotifyPropertyChanged
        SetValue("AspectHeight", ref mAspectHeight, value);
        SetValue("AspectWidth", ref mAspectWidth, mAspectHeight* mAspectRatio);
    }
}

И ваше представление(например, 2) привязывает ширину и высоту окна к свойствам AspectWidth и AspectHeight в модели представления.

View.xaml
<Window Width="{Binding AspectWidth}"
        Height="{Binding AspectHeight}">
</Window>

Таким образом, в любом случае вы переопределяете OnRenderSizeChanged.Детали того, как вы реализуете этот метод, соответствуют вашим вкусам.Я предполагаю, что Пример №2 ближе к чистому «MVVM», но в этом случае он также может быть излишним.

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