在WPF程序中,我想获得当前(键盘)Focus,存储它并在以后重新设置它.
为了获得当前的焦点,我使用:
DependencyObject focusScope = FocusManager.GetFocusScope(d);
_lastFocus = FocusManager.GetFocusedElement(focusScope);
Run Code Online (Sandbox Code Playgroud)
要稍后设置我使用:
if (_lastFocus != null)
{
IInputElement setFocus = _lastFocus;
_lastFocus = null;
d.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new ThreadStart(delegate
{
FocusManager.SetFocusedElement(d, setFocus);
}));
}
Run Code Online (Sandbox Code Playgroud)
这个工作一次.但是,如果我再试一次,它会起作用,直到我重新创建我试图设置焦点的有问题的对话框,即使它做了同样的事情(我追踪并设置焦点).而是主窗口本身获得焦点.
我曾经听说过WPF中有两种焦点,我是否还需要设置其他内容以获得一致的结果?
She*_*dan 22
你是对的.WPF具有逻辑焦点,您在那里使用键盘焦点.您可以在MSDN 的焦点概述页面中找到这两者的完整详细信息.从该页面:
键盘焦点
键盘焦点是指当前正在接收键盘输入的元素.整个桌面上只有一个元素具有键盘焦点.在WPF中,具有键盘焦点的元素将IsKeyboardFocused设置为true.Keyboard类上的静态属性FocusedElement获取当前具有键盘焦点的元素.
为了使元素获得键盘焦点,必须将基本元素上的Focusable和IsVisible属性设置为true.某些类(如Panel基类)默认情况下将Focusable设置为false; 因此,如果您希望这样的元素能够获得键盘焦点,则必须将Focusable设置为true.
键盘焦点可以通过用户与UI的交互来获得,例如标签到元素或在某些元素上单击鼠标.也可以使用Keyboard类上的Focus方法以编程方式获得键盘焦点.Focus方法尝试为指定的元素键盘焦点.返回的元素是具有键盘焦点的元素,如果旧焦点对象或新焦点对象阻止请求,则该元素可能是与请求不同的元素.
逻辑焦点
逻辑焦点是指焦点范围内的FocusManager.FocusedElement.焦点范围是在其范围内跟踪FocusedElement的元素.当键盘焦点离开焦点范围时,聚焦元素将失去键盘焦点,但将保持逻辑焦点.当键盘焦点返回到焦点范围时,焦点元素将获得键盘焦点.这允许在多个聚焦范围之间改变键盘焦点,但确保当聚焦返回聚焦范围时聚焦范围中的聚焦元素重新获得键盘聚焦.
可以有多个元素在应用程序中具有逻辑焦点,但可能只有一个元素在特定焦点范围内具有逻辑焦点.
具有键盘焦点的元素具有其所属的焦点范围的逻辑焦点.
回到你的问题,你没有使用的另一种焦点是Keyboard.Focus
.你可以像这样使用它:
Keyboard.Focus(theButtonThatYouWantToFocus);
Run Code Online (Sandbox Code Playgroud)
另请注意,该UIElement.Focus()
方法将尝试将逻辑键盘和键盘焦点都设置为调用它的元素.如果将键盘焦点和逻辑焦点设置为此元素并且仅将逻辑焦点设置为此元素,则它将返回.true
false
可用于聚焦控件的另一种方法是使用FocusManager.FocusedElement
Attached Property
.大多数人静态地使用它,在这种情况下,这将在视图加载时只工作一次:
<Grid FocusManager.FocusedElement="{Binding ElementName=TextBoxToFocus}">
<TextBox Name="TextBoxToFocus" Text="Focus Me" />
<Grid>
Run Code Online (Sandbox Code Playgroud)
但是,它是可以在使用这个DataTrigger
并设置它依赖于一个自定义bool
属性,在这个例子中,IsFocused
属性:
<Style x:Key="FocusableTextBoxStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsFocused}" Value="True">
<Setter Property="FocusManager.FocusedElement"
Value="{Binding RelativeSource={RelativeSource Self}}" />
</DataTrigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
因此,每当我IsFocused
从视图模型将属性设置为true时,应用此属性的任何元素Style
都将获得逻辑焦点.现在显然,这Style
是用于TextBox
控件,但是如果你将它改为Control
例如它仍然可以工作.
归档时间: |
|
查看次数: |
19732 次 |
最近记录: |