我有一个程序,只有相应的userControl具有焦点时才能激活按钮。
我正在使用MVVM灯,并获得了一个实现ICommand接口的命令。
我尝试过使用Keyboard.FocusedElement,但这不会返回任何内容。
这是命令的代码(请注意,它现在只返回true以使其正常工作,这当然是我正在尝试解决的问题):
class AddItemToNodeCommand<T> : ICommand
{
public bool CanExecute(object parameter)
{
Debug.WriteLine("fokuselement er: " + Keyboard.FocusedElement);
return true;
// throw new NotImplementedException();
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
Debug.WriteLine("Parameter er: " + parameter);
Debug.WriteLine("fokuselement er: " + Keyboard.FocusedElement);
//throw new NotImplementedException();
}
}
来自viewmodel:
public ICommand AddItemToNodeCommand { get; private set; }
AddItemToNodeCommand = new AddItemToNodeCommand<object>();
最后是一些XAML:
<RibbonButton SmallImageSource="../Images/whatever.png" Label="Attribute" Command="{Binding AddItemToNodeCommand}" CommandParameter="Attribute"/>
我没有为userControl发布xaml,但是想法是当userControl有焦点时,CanExecute应该是真的..我认为它适用于Keyboard.FokusedElement,但我错了。我该怎么办?
提前谢谢。
答案 0 :(得分:0)
似乎Keyboard.FocusedElement
有点邪恶。
查看here以获取涉及附加行为并覆盖Keyboard.GotKeyboardFocusEvent
的解决方案。我试了一下,似乎工作了。
否则,您可以绑定到IsKeyboardFocused
或IsKeyboardFocusWithin
。只需将它放在你的xaml中即可获得一个简单的例子:
<StackPanel>
<TextBox Name="test_txtbx" >Hullo</TextBox>
<TextBox Name="test_txtbx_2">Hullo 2</TextBox>
<Label Content="{Binding ElementName=test_txtbx, Path=IsKeyboardFocused}"></Label>
<Label Content="{Binding ElementName=test_txtbx_2,Path=IsKeyboardFocusWithin }"></Label>
<Button Click="TestClick">test me </Button>
</StackPanel>
标签显示匹配的文本框是否具有焦点。
(这是一个old article,其中说焦点也很有趣..但如果仍然相关的话也不知道。)