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 クラスでイベントを提供して、プロパティの更新によってプロパティの変更通知が自動的に発生するようにするというアイデアをいじりましたが、私の要件はウィンドウ サイズを追跡して起動時に設定することなので、気にしませんでした。 . それが役立つことを願っています。
サイズを変更したいウィンドウが 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;
}
}