在WPF中实现一个弹出层自动获取焦点,弹出层实现是通过其UserControl的依赖属性Visibility的绑定实现的,让UserControl上的TextBox获取焦点,初始实现代码如下:

        public Visibility IsVisibile
{
get { return (Visibility)GetValue(IsVisibileProperty); }
set { SetValue(IsVisibileProperty, value); }
}
public static readonly DependencyProperty IsVisibileProperty =
DependencyProperty.Register("IsVisibile", typeof(Visibility), typeof(WordsKeyboard), new PropertyMetadata(Visibility.Collapsed,new PropertyChangedCallback((d,e)=>
{
if((Visibility)e.NewValue==Visibility.Visibile)
(d as MainUserControl).textBox.Focus(); })));

但是第一次弹出该层的时候焦点未在textBox上,除了第一次弹出未获取到焦点后面的弹出都获取到了,为了解决第一次弹出层的TextBox未获取到焦点采用了定时器延时的方法,解决方案如下:

/// <summary>
/// 定义个定时器
/// </summary>
DispatcherTimer timer = new DispatcherTimer();
/// <summary>
/// 构造方法
/// </summary>
public MainUserContrl()
{
InitializeComponent();
timer.Interval = new TimeSpan();
timer.Tick += timer_Tick;
} /// <summary>
/// 定时器间隔执行方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void timer_Tick(object sender, EventArgs e)
{
this.MainText.Focus();
timer.Stop();
}
/// <summary>
/// 控制改用户控件显示隐藏的依赖属性
/// </summary>
public Visibility IsVisibile
{
get { return (Visibility)GetValue(IsVisibileProperty); }
set { SetValue(IsVisibileProperty, value); }
}
public static readonly DependencyProperty IsVisibileProperty =
DependencyProperty.Register("IsVisibile", typeof(Visibility), typeof(WordsKeyboard), new PropertyMetadata(Visibility.Collapsed,new PropertyChangedCallback((d,e)=>
{
if((Visibility)e.NewValue==Visibility.Collapsed)
(d as WordsKeyboard).KillKeyboard();
else
{
(d as MainUserControl).timer.Start();//开启定时器,让textBox获取到焦点
}
})));

通过延时的方法就可以解决掉弹出层第一次无法获取焦点的问题了!而后面让textbox在能使用的情况下不能失去焦点(除非点击弹出层的关闭按钮,让弹出层消失),初始实现代码如下:

  /// <summary>
/// textBox失去焦点事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void textBox_LostFocus(object sender,RoutedEventArgs e)
{
if(textBox.IsEnabled&&!btnCancle.IsFocused)
textBox.Focus();
}

上述实现,会出现死循环,假如不出现死循环btnCancle.IsFocused的值一直是false,因为取消按钮一直没有获取到焦点!而解决方案实现如下:

 DispatcherTimer timerLoseFocuse = new DispatcherTimer();
timerLoseFocuse.Interval = new TimeSpan(,,,,);
timerLoseFocuse.Tick+=(s,e)=>
{
if(CardNumArea.IsEnabled&&!BtnCancel.IsFocused)
{
this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Render,new Action(()=>
{
t.extBox.Focus();
}));//改方法能解决掉LoseFocuse出现死循环的问题
}
timerLoseFocuse.Stop();
};
/// <summary>
///失去焦点事件
/// </summary>
private void textBox_LostFocus(object sender, RoutedEventArgs e)
{
timerLoseFocuse.Start(); }

通过定时器解决取消按钮无法获取到获取到焦点的问题,否则点击取消无法执行其点击事件

WPF的TextBox的焦点获取与失去焦点的死循环解决方案的更多相关文章

  1. WP8.1&Win10开发:TextBox获取和失去焦点小技巧

    获取焦点:用Focus方法让Textbox获取焦点.代码示例:textbox.Focus(FocusState.Pointer); 失去焦点:让其他控件获取焦点,如Textblock控件(注意要将Te ...

  2. WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法

    WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法 在WPF的TextBox的LostFocus事件中直接使用Focus()方法会出现死循环的问题 正确的使用方式有2中方法: 方法一 ...

  3. 【msdn wpf forum翻译】获取当前窗口焦点所在的元素

    原文:[msdn wpf forum翻译]获取当前窗口焦点所在的元素 原文地址: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/6b ...

  4. Wpf解决TextBox文件拖入问题、拖放问题

    在WPF中,当我们尝试向TextBox中拖放文件,从而获取其路径时,往往无法成功(拖放文字可以成功).造成这种原因关键是WPF的TextBox对拖放事件处理机制的不同, 解放方法如下: 使用Previ ...

  5. WPF中TextBox文件拖放问题

    在WPF中,当我们尝试向TextBox中拖放文件,从而获取其路径时,往往无法成功(拖放文字可以成功).造成这种原因关键是WPF的TextBox对拖放事件处理机制的不同,具体可参考这篇文章Textbox ...

  6. 解决WPF中TextBox文件拖放问题

    在WPF中,当我们尝试向TextBox中拖放文件,从而获取其路径时,往往无法成功(拖放文字可以成功).造成这种原因关键是WPF的TextBox对拖放事件处理机制的不同,具体可参考这篇文章Textbox ...

  7. jquery的blur之后,focus获取不到焦点的解决办法

    一:很多童鞋可能会遇到这种情况: jquery的blur之后,focus获取不到焦点. 二:使用场景: 用户填写信息的时候,若邮箱为空,则提示 请填写邮箱,并将光标置于填写邮箱的文本框里,方便用户的再 ...

  8. C#让TopMost窗体弹出并置顶层但不获取当前输入焦点的终极办法

    为了使程序在弹出窗口时置顶层且不获取系统输入焦点,避免影响用户当前的操作,来电通来电弹屏软件尝试过N多种办法,例如:弹出前保存当前焦点窗口句柄,弹出时因为使用TopMost系统默认将焦点交给了弹出窗口 ...

  9. [WPF] 动画Completed事件里获取执行该动画的UI对象

    原文:[WPF] 动画Completed事件里获取执行该动画的UI对象 昨天群里有位童鞋提出如何在动画完成事件Completed里获取到执行该动画的UI对象. WPF里动画的Completed的本身并 ...

随机推荐

  1. 没有指针的java语言

    一.java中引用(reference)实质就是指针 与C语言的指针比较: 1.引用是受控的安全的 2.空引用会被检查 java中不能够访问没有引用到的内存,这也是java的自动垃圾回收机制的基础之一 ...

  2. Windows 环境下基于 nginx 的本地 PyPI 源

    Windows 环境下基于 nginx 的本地 PyPI 源的搭建: 1.登录 nginx 官网,下载安装包

  3. 去ECSHOP版权,去官方后门

    ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店.系统开源但不免费,是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序.目前最新版本为2.7.3 0708版.1.首先 ...

  4. WinForm程序启动控制台窗口Console

    本文转载:http://blog.csdn.net/oyi319/article/details/5753311 2.WinForm程序和控制台窗口Console 如果你调试过SharpDevelop ...

  5. linux和windows文件名称长度限制

    Linux文件名称的长度限制是255个字符 windows下全然限定文件名称必须少于260个字符,文件夹名必须小于248个字符. linux下文件数.文件夹数.文件名称长度的各种限制 下面測试都是在没 ...

  6. 【51】编写new和delete时需固守常规

    1.[50]讲了,有很多理由需要写个自定义的new/delete,自定义new/delete的时候,需要遵守一些规则. 2.循环申请,直到成功或者抛出异常,如下: void* operator new ...

  7. Spring技术内幕:Spring AOP的实现原理(二)

    **二.AOP的设计与实现 1.JVM的动态代理特性** 在Spring AOP实现中, 使用的核心技术时动态代理.而这样的动态代理实际上是JDK的一个特性.通过JDK的动态代理特性,能够为随意Jav ...

  8. 从问题看本质: 研究TCP close_wait的内幕

    Socket应用服务器TomcatOSUbuntu  /* * @author: ahuaxuan * @date: 2010-4-30 */ 最近遇到的一个关于socket.close的问题,在某个 ...

  9. ExtJs Tree加载选项卡,选项卡加载页面不用iframe

    点击树节点,自动加载选项卡对应的页面, 效果图: JS Code: 一.创建TreeStore var store = Ext.create('Ext.data.TreeStore', { root: ...

  10. Html简单demo_html列表中进行编辑操作

    html列表中进行编辑操作 <div class="_sort_box" style="float: left;"><?php echo $v ...