- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
基本 ICommand 接口(interface)实现(例如 DelegateCommand 和 RelayCommand)缺少 RoutedCommand 类中包含的 InputGestures 属性。此属性支持绑定(bind)到 KeyGesture,并且 RoutedUICommand 中的 Text 属性支持设置控件的 header 。例如:
<MenuItem Header="File">
<MenuItem Command="Open" />
结果是在"file"菜单项下出现一个标记为“打开 Ctrl + O”的菜单项。对于手势,InputBindings会将输入手势映射到命令,但您失去了 InputGestureText 支持。
如何在为 XAML 或 View 模型内的命令定义 KeyGestures 和 Text 的同时保持绑定(bind)到 View 模型的 ICommand 的简单性?例如,我希望在上下文菜单和主菜单中公开一个命令来显示相同的 Header 和 InputGestureText,如 RoutedUICommand 支持的那样,但该命令的实现位于 View 模型内部,而不是在 Window 后面的代码内部。/p>
最佳答案
查看反射器中的MenuItem
,我们可以看到MenuItem如何获取Header
/InputGesture
值,即:
private static object CoerceInputGestureText(DependencyObject d, object value)
{
RoutedCommand command;
MenuItem item = (MenuItem) d;
if ((string.IsNullOrEmpty((string) value) &&
!item.HasNonDefaultValue(InputGestureTextProperty)) &&
((command = item.Command as RoutedCommand) != null))
{
InputGestureCollection inputGestures = command.InputGestures;
// Get appropriate gesture....
}
return value;
}
有类似的代码可以根据当前命令强制 Header 属性,但在本例中,它会查找 RoatedUICommand
。这告诉我们,命令必须是 RoatedCommand
/RoulatedUICommand
的实例,才能利用 MenuItem
的此功能。
查看反射器中的 RoatedCommand
,发现没有一种简单的方法来创建派生自 RoatedCommand
的 DelegateCommand
,因为它是 CanExecute
/Execute
方法不是虚拟的。
我们可以编写如下代码:
public class DelegateCommand : RoutedCommand, ICommand
{
bool ICommand.CanExecute(object parameter) {
// Insert delegate can execute logic
}
void ICommand.Execute(object parameter) {
// Insert delegate execute logic
}
}
但这并不能阻止调用 RoatedCommand
上的非显式 CanExecute
/Execute
方法。这可能是也可能不是问题。
或者,我们可以创建一个自定义的 MenuItem
,它足够智能,可以查找我们的 DelegateCommand(或其他地方)并使用它的文本/手势。
public class MyMenuItem : MenuItem {
static MyMenuItem() {
InputGestureTextProperty.OverrideMetadata(typeof(MyMenuItem),
new FrameworkPropertyMetadata(string.Empty, null, CoerceInputGestureText));
}
private static object CoerceInputGestureText(DependencyObject d, object value) {
MenuItem item = (MenuItem)d;
var command = item as DelegateCommand;
if ((string.IsNullOrEmpty((string)value) &&
DependencyPropertyHelper.GetValueSource(item, InputGestureTextProperty).BaseValueSource == BaseValueSource.Default &&
command != null) {
InputGestureCollection inputGestures = command.InputGestures;
// Get appropriate gesture....
}
// Call MenuItem Coerce
var coerce = InputGestureTextProperty.GetMetadata(typeof(MenuItem)).CoerceValueCallback;
return coerce(d, value);
}
}
关于wpf - ViewModel 中的 RoutedUICommand 与 ICommand 以及使用 InputBinding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9131711/
我想在 ListBoxItem 上放一个命令。 ListBoxItem 使用由 StackPanel(包含 Image 和 TextBlock,均使用 Binding)组成的 DataTemplate
我正在使用 MVVM 设计模式创建 WPF 应用程序,并且我正在尝试扩展 TabItem 控件,以便在用户单击鼠标中键时关闭选项卡。我正在尝试使用 InputBindings 来实现这一点,并且在我尝
我设计了一个可重用的用户控件。它包含 UserControl.InputBindings。它非常简单,因为它只包含一个标签和一个按钮(以及新属性等) 当我在窗口中使用该控件时,它运行良好。但键绑定(b
我想为 Style 中的每个 ListBoxItem 添加右键单击和左键单击命令。这可能吗?
在我的代码的 MainView 中,我有这个事件来捕获 keyDown: #region Constructor PreviewKeyDown += SoftKeyMainPreviewKeyDown
我有一个带有多个窗口的 WPF 应用程序。我想定义 GLOBAL inputBindings。 要定义本地输入绑定(bind),我只需在 Window.InputBindings 或 UserCont
通过点击按钮,按钮可以正常工作。 问题:当第一次加载 UserControl 并且我没有按其中的任何按钮时,键绑定(bind)不起作用。 手动点击按钮后,键绑定(bind)会正常工作。所以很明显我想让
我有一个 MainView (Window) 作为 shell,当用户导航应用程序时,我在其中加载包含不同“页面”或“ View ”的不同 UserControl。 我通过将 ViewModel 设置
为什么 ListView.InputBindings 不起作用? 我已经以同样的方式实现了 Interaction.Triggers,它工作得很好。
我有一个非常简单的应用程序,我在其中尝试将键盘快捷方式绑定(bind)到绑定(bind)到菜单项的 WPF 命令。该应用程序本身仅包含一个 Menu 和一个 WebBrowser 控件。 当我在 We
WPF 允许我使用 InputBindings 属性轻松地将窗口级别的键盘快捷方式绑定(bind)到方法。这在 WinRT 中相当于什么?在 WinRT 中将键盘快捷键绑定(bind)到方法的正确方法
我在网上找不到任何看起来像这样的东西。我正在寻找一种在代码中创建键绑定(bind)集合的方法(使用键绑定(bind) ViewModel),然后将集合绑定(bind)到 View ,而不是在 Xaml
我知道这是一个通用标题,但我的问题很具体。我认为这将归结为实践问题。所以,我有以下代码: public partial class MainWindow : Window { Initiali
我正在尝试创建具有以下功能的 DataGrid: 只读数据网格,但通过双击和单独的编辑表单(双击特定行)提供编辑功能 调用新建/编辑/删除表单的上下文菜单(右键单击整个 DataGrid) 调用删除表
试图在 WPF 的 ListBox 中对我的 ListBoxItems 进行一些键绑定(bind)。我正在使用 MVVM,并将 ListBox 的 ItemSource 绑定(bind)到 ViewM
基本 ICommand 接口(interface)实现(例如 DelegateCommand 和 RelayCommand)缺少 RoutedCommand 类中包含的 InputGestures 属
我希望对某人来说这是一个明显的问题。我希望当用户双击列表框中的 ListBoxItem 时触发编辑命令。我之前已经在用户控件中完成了此操作,但想直接在 VIEW 中完成此操作,因为它是一个足够简单的列
我有一个按钮和这样的 TextEdit,它们工作正常: 我想在用户按 Enter 时进行搜索,所以我以这种方式更改了我的代码:
我是一名优秀的程序员,十分优秀!