WPF - 单击文本框外部时删除焦点

Jac*_*obJ 24 c# wpf focus click

我有一些文本框,我希望专注于与WPF应用程序的正常行为略有不同.基本上,我希望他们的行为更像是网页上的文本框行为.也就是说,如果我点击文本框外的任何地方,它将失去焦点.这样做的最佳方法是什么?

如果答案是以编程方式移除焦点,那么在边界外检测Mouseclick的最佳方法是什么?如果我点击的元素将成为焦点的新接收者,该怎么办?

lov*_*nce 27

而不是向窗口添加新控件,我认为你应该为你的Grid命名并对窗口上的MouseDown事件作出反应,将焦点移动到Grid本身.像这样的东西:

<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" 
          Background="#01FFFFFF"
          KeyDown="Grid_KeyDown" 
          Name="grid1" 
          Focusable="True">

          <TextBox Width="120" Margin="117,61,0,0" 
                   Name="textBox1" 
                   VerticalAlignment="Top" 
                   HorizontalAlignment="Left"/>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

代码背后:

private void window1_MouseDown(object sender, MouseButtonEventArgs e)
{
    grid1.Focus();
}
Run Code Online (Sandbox Code Playgroud)

  • @JacobJ:哎呀..我想写的是在“网格”而不是窗口中添加名称。编辑。感谢您指出! (2认同)
  • @ Merlyn Morgan-Graham:简单来说,您需要做的是,将Name属性添加到网格中,使网格可聚焦,在窗口发生鼠标按下事件时:将焦点设置到该网格。那是你尝试过的吗? (2认同)
  • 确保您的网格具有*非透明*背景颜色,否则它无法响应 mousedown 事件。 (2认同)
  • @user3162662:背景颜色不需要是不透明的。但需要指定它(即不为空)才能触发 mousedown 事件。您可以使用“Background=”Transparent“”,该事件将会触发。 (2认同)

小智 14

我认为,解决此问题的更好方法是将MouseDown事件处理程序添加到窗口,后面是代码:

private void window_MouseDown(object sender, MouseButtonEventArgs e)
{
    Keyboard.ClearFocus();
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道我来晚了,但这(大约)是我针对这个同样的问题(只是想回复@skiwi提出的问题)所采用的解决方案。我可以通过在清除焦点之前抓住`Keyboard.FocusedElement`,然后执行`element.RaiseEvent(new RoutedEventArgs(UIElement.LostFocusEvent))`来解决这个问题,因为我的文本框的边框取决于焦点状态,所以我必须这样做。 (3认同)