【问题标题】:How to bind a keydown to a button's click event UWP?如何将keydown绑定到按钮的点击事件UWP?
【发布时间】:2016-01-28 13:36:22
【问题描述】:

我有一个小的 UWP 计算器应用程序,我正在尝试弄清楚如何将键盘数字绑定到按钮的单击事件 x:Bind。在下面的例子中,我将内容“7”传递给 ViewModel 中的按钮 RoutedEventArgs。理想情况下,我只需将键盘和数字键盘 7 都绑定到 XAML 中的按钮,而不需要单独的事件处理程序。还是我需要使用事件处理程序后面的代码将数字绑定到 ViewModel 的事件处理程序?

<Button x:Name="SevenButton"
        Grid.Row="4"
        Grid.Column="2"
        Content="7"
        Click="{x:Bind ViewModel.OnNumberBtnClick}"></Button>

//ViewModel
public void OnNumberBtnClick(object sender, RoutedEventArgs args)
{
    if ((_outputValue) == "0" || (isOperationPerformed))
        _outputValue = "";

    isOperationPerformed = false;
    Button numberBtnClick = (Button)sender;

    if ((string)numberBtnClick.Content == ".")
    {
        if (!_outputValue.Contains("."))
        {
            OutputValue = OutputValue + numberBtnClick.Content;
        }
    }
    else
    {
        OutputValue = OutputValue + numberBtnClick.Content;
    }
}

//OnPropertyChanged
public string OutputValue
{
    get
    {
        return _outputValue;
    }
    set
    {
        _outputValue = value;
        OnPropertyChanged("OutputValue");
    }
}

谢谢你, 标记

所以,在听从了 RareNcool 的一些建议之后,这就是我想出的。还有一些问题需要解决,比如专注于文本框,但除此之外它正在工作。

在我的视图中,我刚刚向 ViewModel KeyRoutedEventArgs 事件添加了另一个绑定:

        <TextBlock x:Name="OutputValueTextBlock"
                   IsTextSelectionEnabled="True"
                   KeyDown="{x:Bind ViewModel.OnKeyboardNumberInput, Mode=OneWay}"
                   Text="{x:Bind ViewModel.OutputValue, Mode=TwoWay}"></TextBlock>     

我在 ViewModel 中创建了这个事件:

  public void OnKeyboardNumberInput(object sender, KeyRoutedEventArgs e)
    {
        if (e.Key == VirtualKey.Number0 || e.Key == VirtualKey.NumberPad0 || (isOperationPerformed))
            _outputValue = "";

        if ((e.Key > VirtualKey.Number0 || e.Key < VirtualKey.Number9) || (e.Key > VirtualKey.NumberPad0 || e.Key < VirtualKey.NumberPad9))
        {
            string numberKey = e.Key.ToString();

            if (e.Key == VirtualKey.Decimal)
            {
                isOperationPerformed = false;

                if (!_outputValue.Contains("."))
                {
                    // Switch if E.Key is a decimal and _output does not contains a decimal.
                    switch (numberKey)
                    {
                        case "Decimal":
                            numberKey = ".";
                            OutputValue = OutputValue + numberKey;
                            break;
                    }
                }
            }
            else
            {
                // Swtich if E.Key is not a decimal.
                switch (numberKey)
                {
                    case "Number0":
                    case "NumberPad0":
                        numberKey = "0";
                        OutputValue = OutputValue + numberKey;
                        break;
                    case "Number1":
                    case "NumberPad1":
                        numberKey = "1";
                        OutputValue = OutputValue + numberKey;
                        break;
                    case "Number2":
                    case "NumberPad2":
                        numberKey = "2";
                        OutputValue = OutputValue + numberKey;
                        break;
                    case "Number3":
                    case "NumberPad3":
                        numberKey = "3";
                        OutputValue = OutputValue + numberKey;
                        break;
                    case "Number4":
                    case "NumberPad4":
                        numberKey = "4";
                        OutputValue = OutputValue + numberKey;
                        break;
                    case "Number5":
                    case "NumberPad5":
                        numberKey = "5";
                        OutputValue = OutputValue + numberKey;
                        break;
                    case "Number6":
                    case "NumberPad6":
                        numberKey = "6";
                        OutputValue = OutputValue + numberKey;
                        break;
                    case "Number7":
                    case "NumberPad7":
                        numberKey = "7";
                        OutputValue = OutputValue + numberKey;
                        break;
                    case "Number8":
                    case "NumberPad8":
                        numberKey = "8";
                        OutputValue = OutputValue + numberKey;
                        break;
                    case "Number9":
                    case "NumberPad9":
                        numberKey = "9";
                        OutputValue = OutputValue + numberKey;
                        break;
                }
            }

        }
    }

【问题讨论】:

    标签: c# uwp


    【解决方案1】:

    我会将实际处理放入带有 string 参数的单独函数中,然后捕获 Button Click 和 Page KeyDown 事件并传入它们的内容。但是,如果您真的只想拥有一个函数,您可以将ClickKeyDown 事件都绑定到函数,两个参数类型为objects,然后使用typeof 来确定您需要什么从他们那里得到。

    【讨论】:

    • 我真的在为键盘输入而苦恼。一些示例代码会很有帮助。
    • 我听取了您的建议并正在实施一个单独的功能,但我正在努力解决三个问题。 1 如何将其与 ViewModel 连接起来。 2. 如何将 VirtualKey 枚举转换为字符串。 3 如何在视图中设置焦点。
    • 我在 ViewModel 中创建了一个事件,如下所示: public void OnKeyboardNumberInput(object sender, KeyRoutedEventArgs e) { if (e.Key > VirtualKey.Number0 || e.Key VirtualKey.NumberPad0 || e.Key
    • 但是如何把键字符拉出来呢? VirtualKey virtualKey = (VirtualKey)sender; if (virtualKey ???) { if (!_outputValue.Contains(".")) { OutputValue = OutputValue + virtualKey.???; } } else { OutputValue = OutputValue + virtualKey.???; } } } }
    • 基本上像这样创建一个事件: void Do_Something(string number) { //Do your stuff } 这就是你要提交按钮的内容或密钥的内容。您可以使用ifs 或? :s 来获取密钥,但如果您想要进行密钥映射,那么已经提出了一个完全不同的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2011-09-17
    相关资源
    最近更新 更多