C# 设置窗口';s在ICommands中的位置不工作

C# 设置窗口';s在ICommands中的位置不工作,c#,wpf,icommand,C#,Wpf,Icommand,我有一个简单的WPF应用程序,上面有一个菜单。我正在尝试将快捷方式绑定到其中一个菜单项,但我无法解决此问题。请注意,我做这件事是作为一种爱好,而且对这件事还很陌生 MainWindow.xaml <Window.InputBindings> <KeyBinding Gesture="Ctrl+R" Command="{Binding RepositionWindowCommand}" /> </Window.InputBindings> <Me

我有一个简单的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>
这里的目标是每当我单击菜单项或使用快捷键Ctrl+R时,将主窗口移动到右上角。我还尝试将top、Left和Width放在ICOMAND中,以防下面这样的情况解决问题

    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中时,它无法识别左侧、顶部和宽度。它说“该名称在当前上下文中不存在。”


我错过了什么?如何实现这一目标?

毫无疑问,您不需要在
respositionWindowCommand
内部创建
respositionWindowClass
。要访问命令内的
窗口
实例,应使用
CommandParameter
绑定将其作为参数传递给命令。您还应正确实施
CanExecuteChanged
事件

public类命令:ICommand
{
public void Execute(对象参数)
{
if(参数为Window)
{
window.Left=SystemParameters.PrimaryScreenWidth-window.Width;
window.Top=0;
}
}
公共布尔CanExecute(对象参数)
{
返回true;
}
公共事件事件处理程序CanExecuteChanged
{
add=>CommandManager.RequerySuggested+=值;
remove=>CommandManager.RequerySuggested-=值;
}
}
Xaml使用

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

当然,您不需要在
resposetWindowCommand
中创建
resposetWindowClass
。要访问命令内的
窗口
实例,应使用
CommandParameter
绑定将其作为参数传递给命令。您还应正确实施
CanExecuteChanged
事件

public类命令:ICommand
{
public void Execute(对象参数)
{
if(参数为Window)
{
window.Left=SystemParameters.PrimaryScreenWidth-window.Width;
window.Top=0;
}
}
公共布尔CanExecute(对象参数)
{
返回true;
}
公共事件事件处理程序CanExecuteChanged
{
add=>CommandManager.RequerySuggested+=值;
remove=>CommandManager.RequerySuggested-=值;
}
}
Xaml使用

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


Left不是命令的属性。这是窗口的一个属性。您的命令逻辑应该位于可以访问窗口的其他类中。您通常不会从ICommand派生。请参阅RelayCommand或DelegateCommand,它们是ICommand的常见实现,允许您指定要调用的方法。Left不是命令的属性。这是窗口的一个属性。您的命令逻辑应该位于可以访问窗口的其他类中。您通常不会从ICommand派生。请参阅RelayCommand或DelegateCommand,它们是ICommand的常见实现,允许您指定要调用的方法。这解决了我遇到的问题,但是如果我想在
RespositionWindowCommand
内部创建
RespositionWindowClass
,我该怎么办?我想添加更多的命令,这些命令肯定比从不同类调用的两行代码要长。你不应该这样做,这违反了MVVM和命令模式:)你可以将窗口实例作为参数传递给命令。您还可以将逻辑封装到单独的类中并重用。通过
应用程序始终可以使用主窗口实例。Current.MainWindow
属性,无需再创建一个。这解决了我遇到的问题,但如果我想在
RespostWindowCommand
中创建
RespostWindowClass
,该怎么办?我想添加更多的命令,这些命令肯定比从不同类调用的两行代码要长。你不应该这样做,这违反了MVVM和命令模式:)你可以将窗口实例作为参数传递给命令。您还可以将逻辑封装到单独的类中并重用。主窗口实例始终通过
应用程序.Current.MainWindow
属性可用,无需再创建一个