gpt4 book ai didi

C# WPF 在 XAML 中添加 KeyBinding 事件

转载 作者:太空宇宙 更新时间:2023-11-03 18:24:42 27 4
gpt4 key购买 nike

我正在使用 ChromiumWebBrowser 向我的 C# 应用程序的用户显示一个网站由 CefSharp 提供图书馆。

我正在尝试添加功能以允许用户使用键盘快捷键“放大/缩小”,即 CTRL +/CTRL - .

我已经成功地添加了一个 KeyboardListener使用“低级全局键盘 Hook /接收器”到嵌入式浏览器,网址为:http://www.dylansweb.com/2014/10/low-level-global-keyboard-hook-sink-in-c-net/

目前,当浏览器处于“聚焦”状态并且用户按下键盘上的“+”时,我的应用程序将在浏览器上“放大”。我已经使用:

private void _listener_OnKeyPressed(object sender, KeyPressedArgs e)
{
if(e.KeyPressed == Key.Add)
{
zoomInExecuted();
}
}

我真正想要的只是在用户按住“CTRL”键然后按“+”时允许放大。

我在我的 C# 中编写了以下方法(这是被调用的方法:

private void _listener_OnKeyPressed(object sender, KeyPressedArgs e)
{
Debug.WriteLine("e: " + e.KeyPressed.ToString());

if(e.KeyPressed == Key.LeftCtrl)
{
leftCtrlDown = true;
Debug.WriteLine("LeftCtrl pressed, leftCtrlDown should be true: ", leftCtrlDown.ToString());
}
else
{
leftCtrlDown = false;
}

if(e.KeyPressed == Key.RightCtrl)
{
rightCtrlDown = true;
Debug.WriteLine("RightCtrl pressed, rightCtrlDown should be true: ", rightCtrlDown.ToString());
}
else
{
rightCtrlDown = false;
}

if((leftCtrlDown == true)) //&& (e.KeyPressed == Key.Add))
{
if (e.KeyPressed == Key.Add)
{
Debug.WriteLine("Ctrl & + pressed, 'zoomInExecuted()' should be called ");
zoomInExecuted();
}
}else if((rightCtrlDown == true)) //&& (e.KeyPressed == Key.Add))
{
if (e.KeyPressed == Key.Add)
{
Debug.WriteLine("rightCtrl & + pressed, 'zoomInExecuted()' should be called ");
zoomInExecuted();
}
}
}

我正在使用 <KeyBinding> 调用此方法<Grid> 上的标签其中浏览器显示在我的 XAML 中:

<KeyBinding Modifiers="Ctrl" Key="LeftCtrl" Command="{Binding _listener_OnKeyPressed}"></KeyBinding>

但我遇到的问题是:虽然应用程序检测到何时按下“CTRL”键(调试写入控制台),但它似乎无法检测到第二次按下键(“+”键)。

我尝试添加第二个监听器,它在第一个监听器内部调用,仅当 leftCtrlDownrightCtrlDown bool 值为真(即当用户按下任一 CTRL 键时),但应用程序似乎仍未检测到按下第二个键...

如何让我的应用“监听”另一个键的按下,同时它已经确认当前正在按下一个键?

编辑

我已经尝试按照答案中的建议进行操作,现在我的 XAML 中有:

<Window x:Class="..."
....
xmlns:local="clr-namespace:Agent"
... >

<Window.Resources>
...
</Window.Resources>
<Grid Name="grid">
...
<Grid x:Name="grdBrowserHost" MinHeight="900" Height="Auto" MinWidth="1205" Width="Auto" Margin="5,0,0,0" DockPanel.Dock="Bottom" Grid.ColumnSpan="1" >
<Grid.InputBindings>
<KeyBinding Modifiers="Ctrl" Key="Add" Command="{Binding _listener_OnKeyPressed}"></KeyBinding>
</Grid.InputBindings>
...
<cefSharp:ChromiumWebBrowser Name="browser" ...>
<KeyBinding Modifiers="Ctrl" Key="Add">
<KeyBinding.Command>
<local:Zoom Executed="zoomInExecuted" />
</KeyBinding.Command>
</KeyBinding>
</cefSharp:ChromiumWebBrowser.InputBindings>
</Grid>
</Grid>
...
</Window>

Zoom.cs我添加的类如下:

namespace Agent
{
class Zoom : ICommand
{
public event EventHandler<object> Executed;

public bool CanExecute(object parameter)
{
return true;
}

public void Execute(object parameter)
{
if (Executed != null)
Executed(this, parameter);
}

public event EventHandler CanExecuteChanged;
}
}

但出于某种原因,我在 XAML 中遇到编译错误,在线:

                                            <local:Zoom Executed="zoomInExecuted" />

上面写着:

The name "Zoom" does not exist in the namespace "clr-namespace:Agent".

尽管很明显。

最佳答案

这条线不能工作:

<KeyBinding Modifiers="Ctrl" Key="LeftCtrl" Command="{Binding _listener_OnKeyPressed}"/>

KeyBinding.Command 需要一个实现 ICommand 的对象,您正在将它绑定(bind)到一个方法。

ICommand 接口(interface)的基本实现如下所示:

class SimpleCommand : ICommand
{
public event EventHandler<object> Executed;

public bool CanExecute(object parameter)
{
return true;
}

public void Execute(object parameter)
{
if (Executed != null)
Executed(this, parameter);
}

public event EventHandler CanExecuteChanged;
}

你可以这样使用:

<Window.InputBindings>
<KeyBinding Modifiers="Control" Key="Add">
<KeyBinding.Command>
<local:SimpleCommand Executed="SimpleCommand_OnExecuted"/>
</KeyBinding.Command>
</KeyBinding>
</Window.InputBindings>

在后面的代码中:

private void SimpleCommand_OnExecuted(object sender, object e)
{
MessageBox.Show("SimpleCommand Executed");
}

通常你会使用Commanding在代码中定义命令并在 XAML 中使用它。当您将该命令绑定(bind)到 KeyBindingButtonMenuItem(或其他内容)时,CanExecute 方法您的实现可用于禁用命令(并因此禁用它绑定(bind)到的元素)。

关于C# WPF 在 XAML 中添加 KeyBinding 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37722559/

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