我有一个UserControl包含一个TextBox.当我的主窗口加载时,我想将焦点设置到此文本框,所以我添加Focusable="True" GotFocus="UC_GotFocus"到UserControls定义和FocusManager.FocusedElement="{Binding ElementName=login}"我的主窗口定义.在UC_GotFocus方法中,我只是调用.Focus()我想要关注的控件,但这不起作用.
我需要做的就是在应用程序启动时有TextBox一个UserControl接收焦点.
任何帮助将不胜感激,谢谢.
我对那些肯定是最常见的WPF要求之一感到困惑.我已经阅读了这个问题但是我的解决方案的实现不起作用.
这是无视控件的标记:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfTest">
<Style TargetType="{x:Type local:CustomControl}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomControl}">
<Border>
<TextBox x:Name="myTextBox" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused"
Value="True">
<Setter Property="FocusManager.FocusedElement"
Value="{Binding ElementName=myTextBox}" />
<Setter TargetName="myTextBox"
Property="Background"
Value="Green" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
这是包含CustomControl实例的Window的标记:
<Window x:Class="WpfTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfTest"
Title="Window1" Height="300" Width="300">
<local:CustomControl x:Name="CCtl" />
</Window>
Run Code Online (Sandbox Code Playgroud)
这是代码隐藏的代码:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
Loaded += (RoutedEventHandler)delegate { CCtl.Focus(); };
}
}
Run Code Online (Sandbox Code Playgroud)
加载Window1时,文本框变为绿色(表示触发器有效)但焦点仍然是CCtl而不是文本框.毫无疑问,这与显示以下数据错误的输出有关:
无法找到引用'ElementName = myTextBox'的绑定源.BindingExpression …
好吧,我有一个具有IsEditing属性的控件,为了参数的缘故,它有一个默认模板,通常是一个文本块,但是当IsEditing为true时,它会在文本框中交换以进行就地编辑.现在当控件失去焦点时,如果它仍在编辑,它应该退出编辑模式并在TextBlock模板中交换回来.非常直接,对吧?
想想在Windows资源管理器或桌面上重命名文件的行为(这与我所知道的相同......)这就是我们想要的行为.
问题是您不能使用LostFocus事件,因为当您切换到另一个窗口(或作为FocusManager的元素)时,LostFocus不会触发,因为控件仍具有逻辑焦点,因此无法工作.
如果您改为使用LostKeyboardFocus,虽然这确实解决了"其他FocusManager"问题,但现在您有了一个新问题:当您进行编辑并右键单击文本框以显示上下文菜单时,因为上下文菜单现在有键盘焦点,您的控件失去键盘焦点,退出编辑模式并关闭上下文菜单,使用户感到困惑!
现在我已经尝试设置一个标志,在菜单打开之前忽略LostKeyboardFocus,然后在LostKeyboardFocus事件中使用该fiag来确定是否将其踢出编辑模式,但是如果菜单打开并且我点击其他位置应用程序,因为控件本身不再有键盘焦点(菜单有它)控件永远不会获得另一个LostKeyboardFocus事件,因此它仍然处于编辑模式.(我可能必须在菜单关闭时添加一个检查以查看焦点是什么,然后手动将其从EditMode中踢出来,如果它不是控件.这看起来很有希望.)
那么......任何人都知道如何成功编码这种行为?
标记
我有一个自定义的可组合视图(本质上是表面 + 文本),我想根据焦点状态更改表面的颜色。FocusManager#FocusNode 被标记为内部,我不知道有什么方法可以实现这一点。这只是还不可用吗?还有其他人需要解决这个问题吗?
android focusmanager android-jetpack android-jetpack-compose composable
我们有一个自定义画布,其中有专门的节点,其行为很像标准的MDI应用程序的窗口.期望的行为是,如果"窗口"的任何子控件具有焦点,则该"窗口"被认为是活动的.
现在,IsFocused属性似乎没有级联,这意味着如果子控件具有焦点,它的容器也不会设置为"聚焦",因此我们无法使用它.出于同样的原因,我们无法在容器上设置IsFocused属性,因为我相信它会从孩子那里偷走它.
我唯一的想法是创建一个名为HasChildWithFocus的新DP或类似的东西,然后在代码隐藏中,监听冒泡事件并设置该标志.不确定这是最好的方式.(我们可以将它作为附加属性/附加行为的组合来实现.)
但当然,如果我们可以简单地问一个控件'嘿......你或你的孩子有焦点吗?'会好得多.
你也可以吗?
JTable的默认行为是将焦点更改为下一个单元格,我想强制它将焦点移动到按下TAB键的下一个组件(例如JTextField).
我overrided isCellEditable的方法DefaultTableModel总是返回false:
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
但它仍然没有改变焦点到下一个组件!
我应该如何将JTable更改重点放在下一个组件而不是下一个组件?
我有几个datagrids的应用程序并导出到excel命令,它将聚焦数据网格作为命令参数.是否可以将CommandParameter绑定到FocusManager.FocusedElement,还是必须将它们设置为明确?
提前致谢
我怎样才能在代码中定义容器或聚焦子代的逻辑焦点,而不给它键盘焦点?
我只是想控制哪个孩子会通过Tab键获得焦点或者点击没有击中孩子的容器的一部分,但是如果它还没有给它(或偷窃)实际焦点有它.
而且我还希望通过键盘手势选择特定的孩子或用鼠标点击它仍然是可能的.
我理解键盘焦点和逻辑焦点之间的WPF差异,以及对于一个元素,具有键盘焦点意味着也具有逻辑焦点的事实,但具有逻辑焦点并不意味着该元素具有键盘焦点.
我也理解附加属性FocusManager.FocusedElement定义哪个元素在可视树中具有逻辑焦点,从定义此属性的元素开始.
我已经意识到只有在FocusManager.IsFocusScope设置为true时才使用此属性,而且对于GroupBox等容器也不会使用此属性.
我已经做了很多尝试,大量的搜索和阅读WPF焦点主题,但到目前为止没有成功,我不明白我错过了什么:
FocusManager.SetFocusedElement也给键盘焦点,我暂时将我的子元素的Focusable属性暂时更改为false,它只在第一次没有孩子聚焦之前有效,但是在孩子有焦点之后没有
一个例子来说明我想要实现的目标:我有一组简单的RadioButtons,我想在代码中动态控制当用户将"tab"移动焦点到此GroupBox时,该选项将获得焦点(通常是选项)有isChecked=true).
<GroupBox Header="Options" Name="myGroupBox"
KeyboardNavigation.TabNavigation="Once"
KeyboardNavigation. DirectionalNavigation="Cycle" >
<StackPanel>
<RadioButton GroupName="g1" Name="opt1" Content="Option _1"/>
<RadioButton GroupName="g1" Name="opt2" Content="Option _2"/>
<RadioButton GroupName="g1" Name="opt3" Content="Option _3"/>
</StackPanel>
</GroupBox>
Run Code Online (Sandbox Code Playgroud)
最后一条评论,我知道如何使用ListBox实现选项的动态列表,将列表的selectedItem绑定到数据上下文的属性,然后通过ListBoxItem上的样式和模板将项目模板中的RadioButton的IsChecked属性绑定到IsSelcted它的父ListBoxItem的属性,它的工作原理,但对于我的具体情况,我需要保持我的RadioButtons直接绑定到我的数据上下文的属性,我不能同时将它们绑定到列表的IsSelected属性.
我有多个文本框的网格.根据用户可能采取的操作,应将焦点更改为其中一个文本框.我当前的解决方案使用ViewModel中的字符串属性和xaml中的数据触发器来更改焦点.它工作得很好,但它似乎是一个相当迂回的方式来实现这一点,所以我想知道它是否可以以一种更清晰的方式完成?
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding FocusedItem}" Value="number">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=number}"/>
</DataTrigger>
<DataTrigger Binding="{Binding FocusedItem}" Value="name">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=name}"/>
</DataTrigger>
<DataTrigger Binding="{Binding FocusedItem}" Value="id">
<Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=id}"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Style>
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,属性的值和元素的名称是相同的,所以我想在单个触发器上执行此操作,而不是每个元素都有一个触发器.
也许有人可以想出一个更清洁的方式?
提前致谢
我正在创建一个使用箭头键移动精灵的游戏。我已经添加了箭头键和字母 n 的键绑定,但箭头键不起作用。这是我的代码:
public class MyPanel extends JPanel {
Sprite sprite = new Sprite();
Timer gameClock = new Timer(DELAY, new ActionListener(){
public void actionPerformed(ActionEvent e){
sprite.move();
// omit other methods
}
});
// omit other member variables
public MyPanel(){
Abstract Action newGameAction = new AbstractAction("new game") {
public void actionPerformed(ActionEvent e){
doNewGame();
}
}
setFocusable(true);
addKeyBinding(new Pair<String, Action>("N", newGameAction));
ArrayList<Pair<String, Action>> pairs = sprite.findKeyBindingPairs();
for (Pair<String, Action> p : pairs)
addKeyBindings(p);
gameClock.start();
// omit other panel init
}
private void …Run Code Online (Sandbox Code Playgroud) focusmanager ×10
wpf ×7
focus ×5
java ×2
swing ×2
xaml ×2
android ×1
arrow-keys ×1
binding ×1
c# ×1
composable ×1
containers ×1
data-binding ×1
jtable ×1
key-bindings ×1
lost-focus ×1
lostfocus ×1
mdichild ×1
mvvm ×1