C# FocusManager.FocusedElement和MVVM

C# FocusManager.FocusedElement和MVVM,c#,wpf,mvvm,focus,C#,Wpf,Mvvm,Focus,我想控制哪个按钮在我的视图中是焦点。用户必须能够在不使用鼠标的情况下执行作业。而乔布斯正在经历所有的因素。根据元素的不同,有些按钮会出现,有些则会消失 我可以用依赖属性来做。例如,如果有“上一个”和“下一个”按钮,那么我可以提供IsPreviousFocused和IsNextFocused在特定事件后为它们设置焦点。事件可以是:第一次显示窗口(某些内容应该已经有焦点),到达1个元素(隐藏上一个按钮,设置IsNextFocused),到达最后一个元素(相反),等等 这看起来或多或少是合理的 但是,

我想控制哪个按钮在我的视图中是焦点。用户必须能够在不使用鼠标的情况下执行作业。而乔布斯正在经历所有的因素。根据元素的不同,有些按钮会出现,有些则会消失

我可以用依赖属性来做。例如,如果有“上一个”和“下一个”按钮,那么我可以提供
IsPreviousFocused
IsNextFocused
在特定事件后为它们设置焦点。事件可以是:第一次显示窗口(某些内容应该已经有焦点),到达1个元素(隐藏上一个按钮,设置
IsNextFocused
),到达最后一个元素(相反),等等

这看起来或多或少是合理的

但是,举例来说,如果我有10个按钮(不同的操作),那么所有按钮都必须具有依赖属性

所以我想了一个更简单的方法:当我隐藏按钮时,会有焦点

if(FocusManager.FocusedElement == null) { ... }
如果我能检测到,当没有焦点时,我可以试着将它设置为某个按钮。这样,我真的不需要任何复杂的焦点管理

问题是:如何在MVVM场景中处理
FocusManager.FocusedElement
?如何检测何时没有焦点(当窗口第一次显示时,当某个按钮被单击并变为不可见时,等等)


附言:事实上,我讨厌微软在没有充分考虑的情况下制造另一种技术;focus是一个非常基本的特性(每个人都在他们的软件中关心它),但是没有对它的直接支持(在xaml中);看起来像是“哦,太复杂了,让我们跳过它吧”的解决方案。

您可以使用下面显示的方法从ViewModel控制焦点:

已经有了(而且更可能出现在每个相关和子相关的主题中)。这是一个场景,我必须为每个按钮分别定义变量。我正在寻找一些更普通、更优雅、更轻松的东西。能够在根本没有焦点的情况下进行检测,并将其设置在某个对象上。您可以在ViewModel中定义单个字符串/枚举变量,该变量“命名”聚焦元素。然后,对于每个按钮,可以使用带有ConverterParameter=>的ValueConverter将AttachedProperty绑定到此变量。每个按钮使用不同的ConverterParameter。如果ConverterParameter等于值(ViewModel变量),则ValueConverter应返回true。为什么不使用keybindings或ALT+\u键?为了你的纽扣?@blindmeis,我自己也不喜欢钥匙扣。以一些多页向导(nsis安装程序)为例,您可以在整个过程中按
Enter
键以获得一些结果。向导本身可以通过键绑定启动,但大多数情况下,向导内部的操作都是
Next
(假设默认值适合您)。这是我想要的东西。用户大多数时候会单击下一步,但有时他可以单击上一步或选择一些选项,这就是我需要管理焦点的地方(到达1个元素、最后一个元素、第一个开始等)。