gpt4 book ai didi

.net - Silverlight 4 + MVVM + KeyDown 事件

转载 作者:行者123 更新时间:2023-12-02 03:21:25 24 4
gpt4 key购买 nike

我正在尝试使用 MVVM 设计模式在 Silverlight 4 中构建一个示例游戏来拓宽我的知识面。我也在使用 Laurent Bugnion 的 MvvmLight 工具包(可在此处找到: http://mvvmlight.codeplex.com/ )。我现在想做的就是通过按特定键在 Canvas 内移动形状。我的解决方案包含一个 Player.xaml(只是一个矩形;这将四处移动)和 MainPage.xaml(Canvas 和 Player 控件的实例)。

据我了解,Silverlight 不支持隧道路由事件,仅支持冒泡。我的大问题是 Player.xaml 永远无法识别 KeyDown 事件。它始终首先被 MainPage.xaml 拦截,并且永远不会到达任何子控件,因为它向上冒泡。我希望移动 Player 的逻辑位于 PlayerViewModel 类中,但我不认为 Player 可以知道任何 KeyDown 事件的触发,除非我明确地将它们从 MainPage 向下传递。

我最终将处理程序逻辑添加到 MainPageViewModel 类中。现在我的问题是 MainPageViewModel 不了解 Player.xaml,因此在处理 KeyDown 事件时无法移动此对象。我想这是预期的,因为 ViewModel 不应该了解其关联的 View 。

简单来说...我的 MainPage.xaml 中的 Player 用户控件有没有办法可以直接接受和处理 KeyDown 事件?如果没有,我的 MainPageViewModel 与其 View 的子控件通信的理想方法是什么?我试图尽可能地将代码保留在代码隐藏文件之外。似乎最好将逻辑放入 ViewModel 中,以便于测试并将 UI 与逻辑分离。

(MainPage.xaml)

<UserControl x:Class="MvvmSampleGame.MainPage"
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:game="clr-namespace:MvvmSampleGame"
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.SL4"
mc:Ignorable="d"
Height="300"
Width="300"
DataContext="{Binding Main, Source={StaticResource Locator}}">

<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<cmd:EventToCommand Command="{Binding KeyPressCommand}" PassEventArgsToCommand="True" />
</i:EventTrigger>
</i:Interaction.Triggers>

<Canvas x:Name="LayoutRoot">
<game:Player x:Name="Player1"></game:Player>
</Canvas>

(MainViewModel.cs)

public MainViewModel()
{

KeyPressCommand = new RelayCommand<KeyEventArgs>(KeyPressed);

}

public RelayCommand<KeyEventArgs> KeyPressCommand
{
get;
private set;
}

private void KeyPressed(KeyEventArgs e)
{

if (e.Key == Key.Up || e.Key == Key.W)
{
// move player up

}
else if (e.Key == Key.Left || e.Key == Key.A)
{
// move player left
}
else if (e.Key == Key.Down || e.Key == Key.S)
{
// move player down
}
else if (e.Key == Key.Right || e.Key == Key.D)
{
// move player right
}
}

提前致谢,杰里米

最佳答案

不要使用EventTrigger,而是尝试使用KeyTrigger并将Source对象设置为LayoutRoot。

另一个选择(我认为更好)是让 ViewModel 处理玩家的位置。例如,有一个名为 PlayerTop 的属性和一个名为 PlayerLeft 的属性。将 PLayer 的 Canvas.Top 和 Canvas.Left 属性绑定(bind)到这些属性。当用户按下按键时,将在 VM 上执行更新这些属性的命令。这样虚拟机就不必知道移动了什么,或者如何移动。

这有意义吗?

关于.net - Silverlight 4 + MVVM + KeyDown 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2876107/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com