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