0

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

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

在我的按钮的 ICommand 中,我正在使用:

Application.Current.MainWindow.Height = 500;

但它什么也没做。

4

6 回答 6

8

尝试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不够的。

于 2013-09-06T13:41:59.677 回答
4

我对此有类似的要求,此外我还想跟踪其他一些窗口设置。所以,我有这堂课:

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 类上提供事件的想法,以便对属性的更新可以自动导致属性更改通知,但我的要求是跟踪窗口大小并在启动时设置它,所以我没有打扰. 希望有帮助。

于 2014-03-21T16:29:40.537 回答
1

使用 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。

于 2018-06-07T15:13:12.133 回答
1

我添加这个答案是因为投票最多的答案实际上是不正确的。绑定到 MinHeight 和 MaxHeight,将导致无法使用夹点调整大小的窗口。

<Window Width="{Binding Width}" MinWidth="{Binding Width}" MaxWidth="{Binding Width}">
    ...
</Window>

而是添加Mode=TwoWay到您的绑定中。

<Window Width="{Binging Width, Mode=TwoWay}">
    ...
</Window>
于 2019-05-07T13:20:08.777 回答
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;
    }
}
于 2013-09-06T14:34:24.947 回答
0

这个作品

Application.Current.MainWindow = this;
Application.Current.MainWindow.WindowState = WindowState.Normal;
Application.Current.MainWindow.Width = 800;
Application.Current.MainWindow.Height = 450;
于 2021-02-08T22:23:48.530 回答