2010-06-22 106 views
0

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

回答

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:不要在视图模型

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”,但在这种情况下它也可能是矫枉过正的。