WPF窗口纵横比

时间:2010-06-22 14:29:47

标签: wpf vb.net mvvm

我想知道如何在调整大小时保持WPF中窗口的宽高比(即:16x9) - 如果可能的话,以一种利用MVVM的方式。由于我是MVVM和WPF的新手,我不知道从哪里开始。感谢。

1 个答案:

答案 0 :(得分:1)

使用“纯”MVVM实现可能很难,因为您需要知道调整大小的方向(水平或垂直)。请注意,如果两者同时更改(即用户通过拖动角落调整大小),您将需要决定使用哪一个。

在ViewModel中,您可能会有一个名为AspectRatio的属性。

在您的视图中,您很可能会覆盖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”,但在这种情况下它也可能有点过分。