代码之家  ›  专栏  ›  技术社区  ›  Terrance

wpf mvvm keybinding未立即被识别,并且不总是工作

  •  4
  • Terrance  · 技术社区  · 15 年前

    无论出于什么原因,只要我的WPF应用程序加载,我的用户控件的键绑定就不会工作。它们在我按下窗体上的按钮后工作,但在我通过单击或按Alt键或移动或类似的操作将焦点设置到窗体时不工作。当它们工作时,我的输入键会随机打印一个数字。(有时5个,有时7个等等)。

    <UserControl x:Class="WpfCalculator.View.CalculatorView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="300" Width="300"
        >
    <UserControl.InputBindings>
        <KeyBinding Key="DELETE" Command="{Binding Path=IBackspaceOnInput}" />
        <KeyBinding Key="BACKSPACE" Command="{Binding Path=IBackspaceOnInput}" />
    
        <KeyBinding Key="NUMPAD0" Command="{Binding Path=IAppendToUserInput}" CommandParameter="0" />
        <KeyBinding Key="NUMPAD1" Command="{Binding Path=IAppendToUserInput}" CommandParameter="1" />
        <KeyBinding Key="NUMPAD2" Command="{Binding Path=IAppendToUserInput}" CommandParameter="2" />
        <KeyBinding Key="NUMPAD3" Command="{Binding Path=IAppendToUserInput}" CommandParameter="3" />
        <KeyBinding Key="NUMPAD4" Command="{Binding Path=IAppendToUserInput}" CommandParameter="4" />
        <KeyBinding Key="NUMPAD5" Command="{Binding Path=IAppendToUserInput}" CommandParameter="5" />
        <KeyBinding Key="NUMPAD6" Command="{Binding Path=IAppendToUserInput}" CommandParameter="6" />
        <KeyBinding Key="NUMPAD7" Command="{Binding Path=IAppendToUserInput}" CommandParameter="7" />
        <KeyBinding Key="NUMPAD8" Command="{Binding Path=IAppendToUserInput}" CommandParameter="8" />
        <KeyBinding Key="NUMPAD9" Command="{Binding Path=IAppendToUserInput}" CommandParameter="9" />
    
        <KeyBinding Key="D0" Command="{Binding Path=IAppendToUserInput}" CommandParameter="0" />
        <KeyBinding Key="D1" Command="{Binding Path=IAppendToUserInput}" CommandParameter="1" />
        <KeyBinding Key="D2" Command="{Binding Path=IAppendToUserInput}" CommandParameter="2" />
        <KeyBinding Key="D3" Command="{Binding Path=IAppendToUserInput}" CommandParameter="3" />
        <KeyBinding Key="D4" Command="{Binding Path=IAppendToUserInput}" CommandParameter="4" />
        <KeyBinding Key="D5" Command="{Binding Path=IAppendToUserInput}" CommandParameter="5" />
        <KeyBinding Key="D6" Command="{Binding Path=IAppendToUserInput}" CommandParameter="6" />
        <KeyBinding Key="D7" Command="{Binding Path=IAppendToUserInput}" CommandParameter="7" />
        <KeyBinding Key="D8" Command="{Binding Path=IAppendToUserInput}" CommandParameter="8" />
        <KeyBinding Key="D9" Command="{Binding Path=IAppendToUserInput}" CommandParameter="9" />
    
        <KeyBinding Key="ADD" Command="{Binding Path=IAppendToUserInput}" CommandParameter="+" />
        <KeyBinding Key="SUBTRACT" Command="{Binding Path=IAppendToUserInput}" CommandParameter="-" />
        <KeyBinding Key="MULTIPLY" Command="{Binding Path=IAppendToUserInput}" CommandParameter="*" />
        <KeyBinding Key="DIVIDE" Command="{Binding Path=IAppendToUserInput}" CommandParameter="/" />
    
        <KeyBinding Key="Return" Command="{Binding Path=ICalculateExpression}" CommandParameter="" />
        <KeyBinding Key="Enter" Command="{Binding Path=ICalculateExpression}" CommandParameter="" />
        <KeyBinding Key="Escape" Command="{Binding Path=IClearInput}" CommandParameter="" />
    
        <KeyBinding Gesture="CTRL+M" Command="{Binding Path=IRememberExpression}" CommandParameter="" />
        <KeyBinding Gesture="CTRL+R" Command="{Binding Path=IRecallExpression}" CommandParameter="" />
        <KeyBinding Gesture="CTRL+X" Command="{Binding Path=IForgetExpression}" CommandParameter="" />
    
        <KeyBinding Key="Left" Command="{Binding Path=IMMoveCursor}" CommandParameter="1" />
        <KeyBinding Key="Right" Command="{Binding Path=IMMoveCursor}" CommandParameter="-1" />
    
    </UserControl.InputBindings>
    
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="305" Width="489">
        <TextBox Name="input" HorizontalAlignment="Right"  IsReadOnly="True" Margin="0,12,200,271" Text="{Binding Path=UserInput}" Width="275" />
        <Button Content="CE" Margin="143,0,323,147" Command="{Binding Path=IBackspaceOnInput}" CommandParameter="" Height="23" VerticalAlignment="Bottom" />
        <Button Content="1" Height="23" HorizontalAlignment="Right" Margin="0,106,294,176" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="1" />
        <Button Content="2" Height="23" HorizontalAlignment="Right" Margin="0,106,265,176" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="2" />
        <Button Content="3" Height="23" HorizontalAlignment="Right" Margin="0,106,236,176" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="3" />
        <Button Content="4" Height="23" HorizontalAlignment="Right" Margin="0,77,294,205" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="4" />
        <Button Content="5" Height="23" HorizontalAlignment="Right" Margin="0,77,236,205" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="5" />
        <Button Content="6" Height="23" HorizontalAlignment="Right" Margin="0,77,265,205" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="6" />
        <Button Content="7" Height="23" HorizontalAlignment="Right" Margin="0,48,294,234" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="7" />
        <Button Content="8" Height="23" HorizontalAlignment="Right" Margin="0,48,265,234" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="8" />
        <Button Content="9" Height="23" HorizontalAlignment="Right" Margin="0,48,236,234" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="9" />
        <Button Content="0" Height="23" HorizontalAlignment="Left" Margin="201,135,0,147" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="0" />
    
        <Button Content="+" Height="23" HorizontalAlignment="Right" Margin="0,48,201,234" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="+" />
        <Button Content="-" Height="23" HorizontalAlignment="Right" Margin="0,77,201,205" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="-" />
        <Button Content="*" Height="23" HorizontalAlignment="Right" Margin="0,106,201,176" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="*" />
        <Button Content="/" Height="23" HorizontalAlignment="Right" Margin="0,135,201,147" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="/" />
        <Button Content="." Height="23" HorizontalAlignment="Right" Margin="0,135,236,147" Width="23" Command="{Binding Path=IAppendToUserInput}" CommandParameter="9" />
    
        <Button Content="C" HorizontalAlignment="Right" Margin="0,164,323,118" Width="23" Command="{Binding Path=IClearInput}" CommandParameter="" />
        <Button Content="MC" Height="23" HorizontalAlignment="Right" Margin="0,0,323,234" VerticalAlignment="Bottom" Width="23" Command="{Binding Path=IForgetExpression}" CommandParameter=""/>
        <Button Content="M+" Height="23" HorizontalAlignment="Right" Margin="0,0,323,176" VerticalAlignment="Bottom" Width="23" Command="{Binding Path=IRememberExpression}" CommandParameter=""/>
        <Button Content="MR" Height="23" HorizontalAlignment="Right" Margin="0,0,323,205" VerticalAlignment="Bottom" Width="23" Command="{Binding Path=IRecallExpression}" CommandParameter=""/>
    
        <Expander ExpandDirection="Left" Header="History" Height="91" HorizontalAlignment="Right" Margin="0,193,200,0" VerticalAlignment="Top" Width="275">
            <ListView ItemsSource="{Binding Path=History}" >
                <ListView.View>
                    <GridView >
                        <GridViewColumn Header="Start" DisplayMemberBinding="{Binding Started}"/>
                        <GridViewColumn Header="End" DisplayMemberBinding="{Binding Completed}"/>
                        <GridViewColumn Header="Expression" DisplayMemberBinding="{Binding Calculation}"/>
                        <GridViewColumn Header="Solution" DisplayMemberBinding="{Binding Result}"/>
                    </GridView>
                </ListView.View>
            </ListView>
        </Expander>
        <Button Command="{Binding Path=ICalculateExpression}" CommandParameter="" IsEnabled="{Binding Path=IsEqualsBtnEnabled}" Content="=" Height="23" Margin="172,0,236,118" VerticalAlignment="Bottom" />
    
    </Grid></UserControl>
    

    我真的没有遇到其他人有这个特别的问题,所以我真的不知道该给什么比这更多。告诉我是否需要其他信息?

    2 回复  |  直到 8 年前
        1
  •  6
  •   Vimes L.B    8 年前

    通过使用验证控件加载时是否具有焦点 Mole ?可能是,在手动选择按钮之前,您的父控件保持焦点。至于enter键,听起来好像他们可能正在选择最后单击的按钮,因为它仍然有焦点,而不是触发您的命令。

    您可能需要查看您的命令,因为我不确定声明的设置是否正确。为了 KeyBinding s,您的命令应在XAML中作为 CommandReference ,像 this article 描写。

        2
  •  1
  •   Cyrus Downey    14 年前

    我也遇到了同样的问题。我跟进了焦点问题。我发现当我把焦点放在窗体内的一个按钮上时,命令就开始工作了。如果我的焦点项目被删除而没有重定向(例如从列表框中删除最后一个项目),那么我的命令都不起作用。

    我手动将我的键盘焦点重置为默认项,在这种情况下,我的焦点处于奇怪的状态,导致我的命令中断。在我的例子中,这是页面加载事件和删除命令(当我的列表框中没有其他项目时)。