Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF MVVM密钥绑定_C#_.net_Wpf_Xaml_Mvvm - Fatal编程技术网

C# WPF MVVM密钥绑定

C# WPF MVVM密钥绑定,c#,.net,wpf,xaml,mvvm,C#,.net,Wpf,Xaml,Mvvm,我是WPF新手,我编写的代码似乎不起作用。当按下左箭头键时,我试图将一个矩形挡板向左移动,但当按下左箭头键时,我没有得到响应。我做错了什么 以下是视图: <UserControl.InputBindings> <KeyBinding Key="Left" Command="{Binding MovePaddleLeftCommand}"/> </UserControl.InputBindings> 下面是一个更

我是WPF新手,我编写的代码似乎不起作用。当按下左箭头键时,我试图将一个矩形挡板向左移动,但当按下左箭头键时,我没有得到响应。我做错了什么

以下是视图:

<UserControl.InputBindings>
    <KeyBinding Key="Left" Command="{Binding MovePaddleLeftCommand}"/>
</UserControl.InputBindings>
下面是一个更完整的代码图片,以防相关

GameView.xaml:

<UserControl x:Class="Arkanoid_MkII.Views.GameView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Arkanoid_MkII.Views"
             mc:Ignorable="d"
             Width="1500" Height="800">
    <Canvas Name="GameArea" ClipToBounds="True">
        <Rectangle Canvas.Left="{Binding Path=Paddle.PaddleX}" Canvas.Top="750" Width="{Binding Path=Paddle.Width}" Height="{Binding Path=Paddle.Height}" Fill="{Binding Path=Paddle.Colour}"/>
    </Canvas>
    <UserControl.InputBindings>
        <KeyBinding Key="Left" Command="{Binding MovePaddleLeftCommand}"/>
    </UserControl.InputBindings>
</UserControl>
public partial class GameView : UserControl
    {
        public GameView()
        {
            InitializeComponent();
        }
    }
<Window x:Class="Arkanoid_MkII.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Arkanoid_MkII"
        xmlns:views="clr-namespace:Arkanoid_MkII.Views"
        mc:Ignorable="d"
        Title="MainWindow" SizeToContent="WidthAndHeight" ResizeMode="NoResize" Background="Black" Padding="100">
    <Grid>
        <Border BorderBrush="Black" BorderThickness="5">
            <views:GameView x:Name="GameViewControl" Loaded="GameViewControl_Loaded" />
        </Border>
    </Grid>
</Window>
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void GameViewControl_Loaded(object sender, RoutedEventArgs e)
        {
            Arkanoid_MkII.ViewModels.GameViewModel gameViewModelObject = new Arkanoid_MkII.ViewModels.GameViewModel();

            GameViewControl.DataContext = gameViewModelObject;
        }
    }
private ICommand _movePaddleLeftCommand;
        public ICommand MovePaddleLeftCommand
        {
            get
            {
                return new DelegateCommand(ExecuteCommand, CanExecute);
            }
        }

        private void ExecuteCommand()
        {
            MessageBox.Show("Left");
            MovePaddleLeft();
        }

        private bool CanExecute()
        {
            return true;
        }
MainWindow.xaml:

<UserControl x:Class="Arkanoid_MkII.Views.GameView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Arkanoid_MkII.Views"
             mc:Ignorable="d"
             Width="1500" Height="800">
    <Canvas Name="GameArea" ClipToBounds="True">
        <Rectangle Canvas.Left="{Binding Path=Paddle.PaddleX}" Canvas.Top="750" Width="{Binding Path=Paddle.Width}" Height="{Binding Path=Paddle.Height}" Fill="{Binding Path=Paddle.Colour}"/>
    </Canvas>
    <UserControl.InputBindings>
        <KeyBinding Key="Left" Command="{Binding MovePaddleLeftCommand}"/>
    </UserControl.InputBindings>
</UserControl>
public partial class GameView : UserControl
    {
        public GameView()
        {
            InitializeComponent();
        }
    }
<Window x:Class="Arkanoid_MkII.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Arkanoid_MkII"
        xmlns:views="clr-namespace:Arkanoid_MkII.Views"
        mc:Ignorable="d"
        Title="MainWindow" SizeToContent="WidthAndHeight" ResizeMode="NoResize" Background="Black" Padding="100">
    <Grid>
        <Border BorderBrush="Black" BorderThickness="5">
            <views:GameView x:Name="GameViewControl" Loaded="GameViewControl_Loaded" />
        </Border>
    </Grid>
</Window>
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void GameViewControl_Loaded(object sender, RoutedEventArgs e)
        {
            Arkanoid_MkII.ViewModels.GameViewModel gameViewModelObject = new Arkanoid_MkII.ViewModels.GameViewModel();

            GameViewControl.DataContext = gameViewModelObject;
        }
    }
private ICommand _movePaddleLeftCommand;
        public ICommand MovePaddleLeftCommand
        {
            get
            {
                return new DelegateCommand(ExecuteCommand, CanExecute);
            }
        }

        private void ExecuteCommand()
        {
            MessageBox.Show("Left");
            MovePaddleLeft();
        }

        private bool CanExecute()
        {
            return true;
        }
GameViewModel.cs:

<UserControl x:Class="Arkanoid_MkII.Views.GameView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:Arkanoid_MkII.Views"
             mc:Ignorable="d"
             Width="1500" Height="800">
    <Canvas Name="GameArea" ClipToBounds="True">
        <Rectangle Canvas.Left="{Binding Path=Paddle.PaddleX}" Canvas.Top="750" Width="{Binding Path=Paddle.Width}" Height="{Binding Path=Paddle.Height}" Fill="{Binding Path=Paddle.Colour}"/>
    </Canvas>
    <UserControl.InputBindings>
        <KeyBinding Key="Left" Command="{Binding MovePaddleLeftCommand}"/>
    </UserControl.InputBindings>
</UserControl>
public partial class GameView : UserControl
    {
        public GameView()
        {
            InitializeComponent();
        }
    }
<Window x:Class="Arkanoid_MkII.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Arkanoid_MkII"
        xmlns:views="clr-namespace:Arkanoid_MkII.Views"
        mc:Ignorable="d"
        Title="MainWindow" SizeToContent="WidthAndHeight" ResizeMode="NoResize" Background="Black" Padding="100">
    <Grid>
        <Border BorderBrush="Black" BorderThickness="5">
            <views:GameView x:Name="GameViewControl" Loaded="GameViewControl_Loaded" />
        </Border>
    </Grid>
</Window>
public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void GameViewControl_Loaded(object sender, RoutedEventArgs e)
        {
            Arkanoid_MkII.ViewModels.GameViewModel gameViewModelObject = new Arkanoid_MkII.ViewModels.GameViewModel();

            GameViewControl.DataContext = gameViewModelObject;
        }
    }
private ICommand _movePaddleLeftCommand;
        public ICommand MovePaddleLeftCommand
        {
            get
            {
                return new DelegateCommand(ExecuteCommand, CanExecute);
            }
        }

        private void ExecuteCommand()
        {
            MessageBox.Show("Left");
            MovePaddleLeft();
        }

        private bool CanExecute()
        {
            return true;
        }

要执行命令,
UserControl
必须可聚焦和聚焦:

private void GameViewControl_Loaded(object sender, RoutedEventArgs e)
{
    Arkanoid_MkII.ViewModels.GameViewModel gameViewModelObject = 
        new Arkanoid_MkII.ViewModels.GameViewModel();

    GameViewControl.DataContext = gameViewModelObject;

    GameViewControl.Focusable = true;
    Keyboard.Focus(GameViewControl);
}

如何定义与paddel相关的属性,以及
movepaddleft
方法的作用是什么?paddle被定义为它自己的类paddle,它有一个属性“PaddleX”,它定义了它在X轴上的位置。MovePableLeft方法减少了PableX值,但我认为这不是问题所在,因为MessageBox甚至没有显示,并且当我按下Left键时,MovePableLeft命令中的断点没有被击中