如何使用MVVM方法以编程方式更改WPF中Window的大小?
我将窗口高度从XAML设置为400,然后单击表单上的按钮,尝试将高度增加到500.
在我使用的按钮ICommand中:
Application.Current.MainWindow.Height = 500;
但它没有做任何事情。
答案 0 :(得分:8)
尝试在Loaded
文件的MainWindow.xaml.cs
事件中设置'Application.Current.MainWindow'属性:
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
的 不足以使其正常工作。
答案 1 :(得分:3)
我对此有类似的要求,另外我想跟踪其他一些窗口设置。所以,我有这个课程:
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类上提供一个事件,以便对属性的更新可以自动引起属性更改通知,但我的要求是跟踪窗口大小并在启动时设置它,所以我没有& #39;打扰。希望有所帮助。
答案 2 :(得分:0)
您确定要调整大小的窗口是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;
}
}
答案 3 :(得分:0)
使用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;
}
}
在Window XAML中
Width="{Binding Width, Mode=TwoWay}"
在网格中
<Button x:Name="MyButton" Content="Make 800 wide" />
它在500时打开,当我点击按钮时,它会延伸到800.
答案 4 :(得分:0)
我添加此答案是因为投票最多的答案实际上是不正确的。绑定到MinHeight和MaxHeight将导致无法使用夹点调整窗口大小。
<Window Width="{Binding Width}" MinWidth="{Binding Width}" MaxWidth="{Binding Width}">
...
</Window>
相反,将Mode=TwoWay
添加到您的绑定中。
<Window Width="{Binging Width, Mode=TwoWay}">
...
</Window>
答案 5 :(得分:0)
这个作品
Application.Current.MainWindow = this;
Application.Current.MainWindow.WindowState = WindowState.Normal;
Application.Current.MainWindow.Width = 800;
Application.Current.MainWindow.Height = 450;