我有一个MVVM应用程序,在窗口的左侧有一个WPF TreeView.右侧的详细信息面板根据所选的树节点更改内容.
如果用户选择节点,则详细信息面板的内容会立即更改.如果用户点击该节点,则需要这样做,但如果用户使用键向下/向上导航树,我想延迟更改内容.(与Windows资源管理器的行为相同,至少在Win XP下)我假设我必须在我的ViewModel中知道是否通过鼠标或键盘选择了节点.
我怎样才能做到这一点?
更新:
这是我的第一篇文章,因此我不确定这是不是正确的地方,但我想让社区知道我在此期间做了什么.这是我自己的解决方案.我不是专家,所以我不知道这是不是一个好的解决方案.但它适用于我,如果能帮助别人,我会很高兴.错误修正,改进或更好的解决方案非常受欢迎.
我创建了下面附加的属性HasMouseFocus ...
(首先我使用了MouseEnterEvent但是如果用户使用键向上/向下导航树并且鼠标指针随机遍布任何导航的树项目,这不能很好地工作,因为在这种情况下详细信息立即更新.)
public static bool GetHasMouseFocus(TreeViewItem treeViewItem)
{
return (bool)treeViewItem.GetValue(HasMouseFocusProperty);
}
public static void SetHasMouseFocus(TreeViewItem treeViewItem, bool value)
{
treeViewItem.SetValue(HasMouseFocusProperty, value);
}
public static readonly DependencyProperty HasMouseFocusProperty =
DependencyProperty.RegisterAttached(
"HasMouseFocus",
typeof(bool),
typeof(TreeViewItemProperties),
new UIPropertyMetadata(false, OnHasMouseFocusChanged)
);
static void OnHasMouseFocusChanged(
DependencyObject depObj, DependencyPropertyChangedEventArgs e)
{
TreeViewItem item = depObj as TreeViewItem;
if (item == null)
return;
if (e.NewValue is bool == false)
return;
if ((bool)e.NewValue)
{
item.MouseDown += OnMouseDown;
item.MouseLeave += OnMouseLeave; …Run Code Online (Sandbox Code Playgroud) 我正在尝试将任何按下的键盘键绑定到命令中ViewModel.
我知道我可以绑定一个特定的密钥,使用:
<Window.InputBindings>
<KeyBinding Command="{Binding ChangeIdCommand}" Key="B"/>
</Window.InputBindings>
Run Code Online (Sandbox Code Playgroud)
我可以绑定所有按键,ChangeIdCommand而无需手动输入所有按键吗?
如何在WPF中按下诸如Ctrl+之类的快捷键O(独立于任何特定控件)?
我试图捕捉KeyDown,但KeyEventArgs并没有告诉我是否Control或Alt已关闭.
keydown事件无法正常工作。我想在按下回车键时引发与按钮相同的事件。这是C#
public partial class Search : Control
{
public SearchRevision()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
SearchViewModel vm = this.DataContext as SearchViewModel;
if (vm != null)
vm.Refresh();
}
private void myTextBox_KeyDown(Object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
{
SearchViewModel vm = this.DataContext as SearchViewModel;
if (vm != null)
vm.Refresh();
}
}
private void myTextBox_Escape(Object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
txtName.Text = "";
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想知道如何在ViewModel中使用MVVM处理KeyDown事件.
我有一个TextBox,当用户点击一个不是数字的键时,不应该允许输入.我通常会使用这样的代码(不是完整的代码,只是一个简单的例子):
private void textBox1_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
// Determine whether the keystroke is a number from the top of the keyboard.
if (e.KeyCode < Keys.D0 || e.KeyCode > Keys.D9)
{
e.Handled = true;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我想用命令以某种方式将它放在我的ViewModel中.我是MVVM的新手,我现在只使用Bindings(工作正常:)),但我根本不知道如何使用命令...
我的TextBox看起来像这样:
<TextBox Text="{Binding MyField, Mode=TwoWay}"/>
Run Code Online (Sandbox Code Playgroud)
视图模型:
private string _myfield;
public string MyField{
get { return _myfield; }
set {
_myfield= value;
RaisePropertyChanged( ()=>MyField)
}
}
Run Code Online (Sandbox Code Playgroud)
但是只有当我离开TextBox +我才能调用setter时,我无法访问输入的Key.