在WPF中实现一个弹出层自动获取焦点,弹出层实现是通过其UserControl的依赖属性Visibility的绑定实现的,让UserControl上的TextBox获取焦点,初始实现代码如下:
public Visibility IsVisibile
{
get { return (Visibility)GetValue(IsVisibileProperty); }
set { SetValue(IsVisibileProperty, value); }
}
public static readonly DependencyProperty IsVisibileProperty =
("IsVisibile", typeof(Visibility), typeof(WordsKeyboard), new PropertyMetadata(,new PropertyChangedCallback((d,e)=>
{
if((Visibility)==)
(d as MainUserControl).();
})));
但是第一次弹出该层的时候焦点未在textBox上,除了第一次弹出未获取到焦点后面的弹出都获取到了,为了解决第一次弹出层的TextBox未获取到焦点采用了定时器延时的方法,解决方案如下:
///
/// 定义个定时器
///
DispatcherTimer timer = new DispatcherTimer();
///
/// 构造方法
///
public MainUserContrl()
{
InitializeComponent();
= new TimeSpan();
+= timer_Tick;
}
///
/// 定时器间隔执行方法
///
///
///
void timer_Tick(object sender, EventArgs e)
{
();
();
}
///
/// 控制改用户控件显示隐藏的依赖属性
///
public Visibility IsVisibile
{
get { return (Visibility)GetValue(IsVisibileProperty); }
set { SetValue(IsVisibileProperty, value); }
}
public static readonly DependencyProperty IsVisibileProperty =
("IsVisibile", typeof(Visibility), typeof(WordsKeyboard), new PropertyMetadata(,new PropertyChangedCallback((d,e)=>
{
if((Visibility)==)
(d as WordsKeyboard).KillKeyboard();
else
{
(d as MainUserControl).();//开启定时器,让textBox获取到焦点
}
})));
通过延时的方法就可以解决掉弹出层第一次无法获取焦点的问题了!而后面让textbox在能使用的情况下不能失去焦点(除非点击弹出层的关闭按钮,让弹出层消失),初始实现代码如下:
///
/// textBox失去焦点事件
///
///
///
private void textBox_LostFocus(object sender,RoutedEventArgs e)
{
if(&&!)
();
}
上述实现,会出现死循环,假如不出现死循环的值一直是false,因为取消按钮一直没有获取到焦点!而解决方案实现如下:
DispatcherTimer timerLoseFocuse = new DispatcherTimer();
= new TimeSpan(,,,,);
+=(s,e)=>
{
if(&&!)
{
(,new Action(()=>
{
();
}));//改方法能解决掉LoseFocuse出现死循环的问题
}
();
};
///
///失去焦点事件
///
private void textBox_LostFocus(object sender, RoutedEventArgs e)
{
();
}
通过定时器解决取消按钮无法获取到获取到焦点的问题,否则点击取消无法执行其点击事件
WP8.1&;Win10开发:TextBox获取和失去焦点小技巧
获取焦点:用Focus方法让Textbox获取焦点.代码示例:(); 失去焦点:让其他控件获取焦点,如Textblock控件(注意要将Te ...
WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法
WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法 在WPF的TextBox的LostFocus事件中直接使用Focus()方法会出现死循环的问题 正确的使用方式有2中方法: 方法一 ...
【msdn wpf forum翻译】获取当前窗口焦点所在的元素