在MVVM中以编程方式更改WPF窗口大小

时间:2013-09-06 13:32:23

标签: c# wpf mvvm

如何使用MVVM方法以编程方式更改WPF中Window的大小?

我将窗口高度从XAML设置为400,然后单击表单上的按钮,尝试将高度增加到500.

在我使用的按钮ICommand中:

Application.Current.MainWindow.Height = 500;

但它没有做任何事情。

6 个答案:

答案 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;