在ICommands中设置窗口的位置不起作用

时间:2019-10-31 09:50:37

标签: c# wpf

我有一个简单的WPF应用程序,其顶部有一个菜单。我试图将快捷方式绑定到菜单项之一,但是我无法弄清楚。请注意,这是我的业余爱好,对此还很陌生。

MainWindow.xaml

<Window.InputBindings>
    <KeyBinding Gesture="Ctrl+R" Command="{Binding RepositionWindowCommand}" />
</Window.InputBindings>

<MenuItem Header="_Options">
    <MenuItem x:Name="Menu_RepositionWindow" Header="_Reposition Window" Command="{Binding RepositionWindowCommand}" InputGestureText="Ctrl+R" />
</MenuItem>

MainMenu.cs

namespace WPF_Practice
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataContext = new PracticeDataContext();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            RepositionWindow();
        }

        public void RepositionWindow()
        {
            Left = SystemParameters.PrimaryScreenWidth - Width;
            Top = 0;
        }
    }

    public class PracticeDataContext
    {
        public ICommand RepositionWindowCommand { get; } = new RepositionWindowCommand();
    }

    public class RepositionWindowCommand : ICommand
    {
        public void Execute(object parameter)
        {
            var RepositionWindowClass = new MainWindow();
            RepositionWindowClass.RepositionWindow();
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged { add { } remove { } }
    }
}

这里的目标是每当我单击菜单项或使用Ctrl + R的快捷键时,将主窗口移至右上角。如果解决了问题,我还尝试在ICommand中放置“顶部”,“左侧”和“宽度”,以防万一,如下所示。

    public class RepositionWindowCommand : ICommand
    {
        public void Execute(object parameter)
        {
            Left = SystemParameters.PrimaryScreenWidth - Width;
            Top = 0;
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged { add { } remove { } }
    }

当ICommand中的Left,Top和Width不能识别时。它说:“该名称在当前上下文中不存在。”

我在这里想念什么?我如何实现这个目标?

1 个答案:

答案 0 :(得分:2)

当然,您不需要在RepositionWindowClass内创建RepositionWindowCommand。要访问内部的Window,应使用xaml绑定将其作为参数传递给命令。您还应该正确实现CanExecuteChanged

    public class RepositionWindowCommand : ICommand
    {
        public void Execute(object parameter)
        {
            if (parameter is Window window)
            {
                 window.Left = SystemParameters.PrimaryScreenWidth - window.Width;
                 window.Top = 0;
            }
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public event EventHandler CanExecuteChanged
        {
            add => CommandManager.RequerySuggested += value;
            remove => CommandManager.RequerySuggested -= value;
        }
    }

Xaml用法

<MenuItem x:Name="Menu_RepositionWindow" Header="_Reposition Window" Command="{Binding RepositionWindowCommand}" InputGestureText="Ctrl+R" CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}}"/>