如何使用 MVVM 方法以编程方式更改 WPF 中窗口的大小?
我从 XAML 将窗口高度设置为 400,然后单击表单上的按钮尝试将高度增加到 500。
在我的按钮的 ICommand 中,我正在使用:
Application.Current.MainWindow.Height = 500;
但它什么也没做。
尝试Loaded
在文件中的事件中设置“Application.Current.MainWindow”属性MainWindow.xaml.cs
:
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Application.Current.MainWindow = this;
}
更新>>>
我的朋友,请记住,你说你想使用Application.Current.MainWindow
……这就是你可以使用它的方式。但是,如果您想以 MVVM 方式执行此操作,那么为什么不将值绑定到Window.Width
属性呢?
<Window Width="{Binding Width}" MinWidth="{Binding Width}" MaxWidth="{Binding Width}">
...
</Window>
请注意,绑定到Window.Width
是不够的。
我对此有类似的要求,此外我还想跟踪其他一些窗口设置。所以,我有这堂课:
public class WindowSettings
{
public int Width { get; set; }
public int Height { get; set; }
public int Left { get; set; }
public int Top { get; set; }
}
然后在我的视图模型中,我有:
public WindowSettings WindowSettings
{
get
{
return _windowSettings;
}
}
在 xaml 中,这是:
<Window ...
Height="{Binding WindowSettings.Height,Mode=TwoWay}"
Width="{Binding WindowSettings.Width, Mode=TwoWay}"
Left="{Binding WindowSettings.Left,Mode=TwoWay}"
Top="{Binding WindowSettings.Top,Mode=TwoWay}">
例如,如果我想以编程方式更新宽度,我会这样做:
WindowSettings.Width = 456;
RaisePropertyChangedEvent("WindowSettings.Width");
(当然,我的视图模型继承自实现 INotifyPropertyChanged 的基类。)
我确实玩弄了在 WindowSettings 类上提供事件的想法,以便对属性的更新可以自动导致属性更改通知,但我的要求是跟踪窗口大小并在启动时设置它,所以我没有打扰. 希望有帮助。
使用 VS 2017 和 Caliburn Micro 我只设置宽度没有问题。您这样做的方式不是 MVVM,您的 VM 不需要了解 V 或 int Width 更改时发生的情况。
public class ShellViewModel : Caliburn.Micro.PropertyChangedBase, IShell
{
public ShellViewModel()
{
Width = 500;
}
private int _width;
public int Width
{
get => _width;
set
{
_width = value;
NotifyOfPropertyChange(() => Width);
}
}
public void MyButton()
{
Width = 800;
}
}
在窗口 XAML 中
Width="{Binding Width, Mode=TwoWay}"
在网格中
<Button x:Name="MyButton" Content="Make 800 wide" />
它在 500 处打开,当我单击按钮时,它会延伸到 800。
我添加这个答案是因为投票最多的答案实际上是不正确的。绑定到 MinHeight 和 MaxHeight,将导致无法使用夹点调整大小的窗口。
<Window Width="{Binding Width}" MinWidth="{Binding Width}" MaxWidth="{Binding Width}">
...
</Window>
而是添加Mode=TwoWay
到您的绑定中。
<Window Width="{Binging Width, Mode=TwoWay}">
...
</Window>
您确定要调整大小的窗口是 MainWindow 吗?或者您确定您的命令已成功绑定在您的按钮上?你可以试试下面的代码:
看法:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:viewModel="clr-namespace:WpfApplication1.ViewModel"
Title="Wpf Application" Height="300" Width="400"
WindowStartupLocation="CenterScreen">
<Window.DataContext>
<viewModel:MainWindowViewModel />
</Window.DataContext>
<Grid>
<Button Content="Resize" Command="{Binding ResizeCommand}" IsEnabled="{Binding ResizeCommand.CanExecute}" />
</Grid>
</Window>
视图模型:
public class MainWindowViewModel
{
private RelayCommand _resizeCommand;
public RelayCommand ResizeCommand { get { return _resizeCommand; } }
public MainWindowViewModel()
{
this._resizeCommand = new RelayCommand(this.Resize);
}
private void Resize()
{
Application.Current.MainWindow.Height = 500;
}
}
这个作品
Application.Current.MainWindow = this;
Application.Current.MainWindow.WindowState = WindowState.Normal;
Application.Current.MainWindow.Width = 800;
Application.Current.MainWindow.Height = 450;