- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个控件,一个 ToolBar
和一个 TextBox
。 ToolBar 有一个 Button
,它会打开一个 Popup
,其中包含另一个 Button
。
当前行为:如果我在 TextBox
内单击,它会变成焦点,然后单击 ToolBar
中的按钮,这会打开一个弹出窗口 TextBox
仍然保持焦点并接收所有键盘输入。
现在我知道这是 ToolBar
所在的 FocusScope 内的项目的默认行为,但是当弹出窗口打开时我不需要这种行为。我该如何避免呢?
示例如下:
<Window x:Class="WpfApplication67.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
</Window.Resources>
<StackPanel HorizontalAlignment="Left" Width="400">
<ToolBar>
<ToggleButton Name="openButton">Open Popup</ToggleButton>
<Popup Focusable="True"
Placement="Right"
StaysOpen="False"
IsOpen="{Binding IsChecked, ElementName=openButton, Mode=TwoWay}"
PlacementTarget="{Binding ElementName=openButton}">
<StackPanel
Width="100"
Height="100"
Background="DarkGray"
Focusable="True">
<Button>More</Button>
</StackPanel>
</Popup>
</ToolBar>
<TextBox Text="Set focus on this..." />
</StackPanel>
编辑:我正在努力寻找关于谁将焦点移动到嵌套 FocusScope 内的按钮单击以及如何阻止某些按钮(如弹出窗口内的按钮)这样做的解释。
最佳答案
你主要有三个要求(有错请指正):
让我们一一挑选这些要求。
If pop up is opened, focus should be inside popUp i.e. on StackPanel.
就像我在评论中提到的那样,在 PopUp 的 Opened
事件上关注 stackPanel:
private void Popup_Opened(object sender, EventArgs e)
{
stackPanel.Focus();
}
On close of popUp, focus should retained back to textBox.
Hook Closed 事件并将焦点放回 TextBox:
private void Popup_Closed(object sender, EventArgs e)
{
textBox.Focus();
}
When button inside popUp is clicked, focus should not leave the popUp.
现在,棘手的部分来了。正如评论中提到的,一旦您单击弹出窗口内的按钮,焦点就会移到弹出窗口之外。
您可以阻止的是将处理程序附加到 stackPanel 的 PreviewLostKeyboardFocus
事件。在处理程序检查条件是否键盘焦点在弹出窗口中,设置 e.Handled = true
以便仅在此处处理事件并且不会引发将强制键盘的气泡事件焦点在 stackPanel 之外。
也就是说,如果您在 stackPanel besies 按钮中有另一个 TextBox,则处理事件也不允许您在 popUp 中移动焦点。为了避免这种情况,您可以检查新的焦点元素是否不属于 stackPanel,然后只处理该事件。
这是实现该目标的代码(在 StackPanel 的 PreviewLostKeyboardFocus 事件上添加处理程序):
private void stackPanel_PreviewLostKeyboardFocus(object sender,
KeyboardFocusChangedEventArgs e)
{
var newFocusedChild = e.NewFocus as FrameworkElement;
bool isMovingWithinPanel = newFocusedChild != null
&& newFocusedChild.Parent == stackPanel;
// If keyboard focus is within stackPanel and new focused element is
// outside of stackPanel boundaries then only handle the event.
if (stackPanel.IsKeyboardFocusWithin && !isMovingWithinPanel)
e.Handled = true;
}
关于wpf - 使用 IsFocusScope 选项时如何阻止 FocusManager 将焦点移到打开的弹出窗口之外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22304926/
我使用绑定(bind)将 FocusManager.FocusedElement 作为参数传递。
我有如下的 WPF xaml 代码: 如何将 FocusedElement 绑定(bind)到 ViewModel 中的属性? 类似的代码如下: Switch
我有如下的 WPF xaml 代码: 如何将 FocusedElement 绑定(bind)到 ViewModel 中的属性? 类似的代码如下: Switch
我看到我的 CheckBox 出现奇怪的行为及其焦点/选项卡顺序。 首先是一些“工作”代码:
我正在尝试将键盘焦点设置为包含在堆栈面板中的文本框。当 IsEditMode 变为 true 时,我希望文本框默认成为焦点。 我试过这个代码:
我目前正在编写一个 js 脚本,它改变了一些样式,以便在使用触摸设备时隐藏固定页脚并绝对定位页眉。 我已经能够使用普通的文本输入字段和文本区域成功地实现它,但是由于 CKEditor 没有在 DOM
有谁知道如何在 AlertDialog 中显示或隐藏键盘? focusManager.clearFocus() 在 AlertDialog 中不起作用。 同样适用于 textInputService?
我有几个数据网格的应用程序并导出到 excel 命令,它将焦点数据网格作为命令参数。是否可以将 CommandParameter 绑定(bind)到 FocusManager.FocusedEleme
我看到了以下内容 launching FocusManager.parse_for_input on DOM mutation event 在我运行操纵 DOM 的脚本(基本上是通过更改行顺序对表格进
我有一个应用程序,它可以像一个简单的 WPF 应用程序一样运行良好,在主窗口级别的 GotFocus 上有一个事件处理程序,如下所示: private void MainWindowGotFo
我有两个控件,一个 ToolBar 和一个 TextBox。 ToolBar 有一个 Button,它会打开一个 Popup,其中包含另一个 Button。 当前行为:如果我在 TextBox 内单击
我正在尝试让 WPF 应用程序将其初始焦点设置到网格内部的 TextBox。该 TextBox 将其 Text 属性数据绑定(bind)到可能已设置或未设置文本的 View Controller 。设
从字面上看,我想知道这一点。 在某些情况下,.Focus() 看起来比 SetFocusedElement() 更好。但另一种情况,它是逆转。所以我必须知道那里有什么不同的东西。 此外,根据 MSDN
最近几天我一直在追踪这个错误。我的绑定(bind)被分离了,我不知道为什么。我希望我的一个文本框在我的应用程序启动时具有焦点。所以我使用了一个附加属性来设置焦点元素。我的一些数据绑定(bind)停止工
我是一名优秀的程序员,十分优秀!