爽快的盒饭 · 文本框 - Windows apps | ...· 2 周前 · |
仗义的大象 · WPF 自定义文本框输入法 IME ...· 2 周前 · |
爱运动的咖啡 · QT4 使用QJson_qt4 ...· 3 月前 · |
买醉的伏特加 · 檔案、小工具及 Wiki 的 ...· 1 年前 · |
有胆有识的香瓜 · kettle解除同步条数限制 - 郭小白 ...· 1 年前 · |
愉快的单车 · CVPR 2022 | ...· 1 年前 · |
爽快的绿豆 · 最大的ViT来了!谷歌提出ViT-22B:视 ...· 1 年前 · |
我有一些文本框,我希望焦点的行为与WPF应用程序的正常行为略有不同。基本上,我希望它们的行为更像网页上的文本框。也就是说,如果我单击文本框之外的任何位置,它将失去焦点。最好的方法是什么?
如果答案是以编程方式移除焦点,那么检测边界外的鼠标单击的最佳方法是什么?如果我单击的元素将成为焦点的新接收者,该怎么办?
我不是100%确定,但是如果你在容器元素(网格,StackPanel等)上将
Focusable
设置为true,那么它应该会把焦点从文本框上移开。
如果你点击了可以抓住焦点的元素,你就会得到你需要的东西。例如,如果您有一些面板,您可以处理面板的mouseClick事件来满足您的需求,或者使用Richard Szalay建议。
不能显式地松开控件的焦点。
您可以将焦点设置为其他控件。
**txt.Focusable=true;
label.focus();
Keyboard.Focus(txtPassword);**
尝尝这个
我认为,解决这个问题的更好方法是将MouseDown事件处理程序添加到带有代码的窗口中:
private void window_MouseDown(object sender, MouseButtonEventArgs e)
Keyboard.ClearFocus();
}
另一种对我有效的方法是使用
Mouse.AddPreviewMouseDownOutsideCapturedElementHandler
例如,假设您有一个TextBlock,当单击它时,应该会通过显示一个有焦点的TextBox而变为可编辑。然后,当用户在TextBox外部单击时,它应该再次被隐藏。下面是你怎么做的:
private void YourTextBlock_OnMouseDown(object sender, MouseButtonEventArgs e)
YourTextBox.Visibility = Visibility.Visible;
YourTextBox.Focus();
CaptureMouse();
Mouse.AddPreviewMouseDownOutsideCapturedElementHandler(this, OnMouseDownOutsideElement);
private void OnMouseDownOutsideElement(object sender, MouseButtonEventArgs e)
Mouse.RemovePreviewMouseDownOutsideCapturedElementHandler(this, OnMouseDownOutsideElement);
ReleaseMouseCapture();
YourTextBox.Visibility = Visibility.Hidden;
}
我遇到了类似的问题,但当我在文本框周围包装了一个ScrollViewer控件时,当单击文本框之外的任何位置时,所有文本框都会自动失去焦点。
您可以使用
IsKeyboardFocusedChanged
事件:
myTextBox.IsKeyboardFocusedChanged += myTextBox_IsKeyboardFocusedChanged;
private void SendFileCaptionTextBox_IsKeyboardFocusedChanged(object sender, DependencyPropertyChangedEventArgs e)
if (e.NewValue.ToString() == "True")
// it's focused
// it's not focused
}
若要避免代码隐藏,可以使用此行为
public class ClearFocusOnClickBehavior : Behavior<FrameworkElement>
protected override void OnAttached()
AssociatedObject.MouseDown += AssociatedObject_MouseDown;
base.OnAttached();
private static void AssociatedObject_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
Keyboard.ClearFocus();
protected override void OnDetaching()
AssociatedObject.MouseDown -= AssociatedObject_MouseDown;
}
在XAML中使用:
在您希望他清除焦点的文本框之外的任何元素上,单击add:
<i:Interaction.Behaviors>
<behaviors:ClearFocusOnClickBehavior/>
</i:Interaction.Behaviors>
我已经在react原生WPF应用程序中尝试了选定的答案,但它没有触发textbox的失去焦点,因为textbox没有失去焦点。以下是我的解决方案。
将鼠标按下事件绑定到窗口:
<Window x:Class="WpfApplication1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="412" Width="569" MouseDown="window_MouseDown" Name="window1" >
<Grid ShowGridLines="False" KeyDown="Grid_KeyDown" Name="grid1" Focusable="True">
<TextBox HorizontalAlignment="Left" Margin="117,61,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" />
</Grid>
</Window>
事件是:
private void window_MouseDown(object sender, MouseButtonEventArgs e)
TextBox textBox = Keyboard.FocusedElement as TextBox;
if (textBox != null)
TraversalRequest tRequest = new TraversalRequest(FocusNavigationDirection.Next);
textBox.MoveFocus(tRequest);
}
您可以在应用程序启动时将
PreviewMouseLeftButtonDownEvent
注册到App.xaml.cs中的每种类型的元素。
EventManager.RegisterClassHandler(typeof(UIElement), UIElement.PreviewMouseLeftButtonDownEvent,
new MouseButtonEventHandler(FocusElement));
private void FocusElement(object sender, MouseButtonEventArgs e)
var parent = e.OriginalSource as DependencyObject;
if (parent is UIElement element && !element.Focusable)
element.Focusable = true;
element.Focus();
element.Focusable = false;