wpf使某个控件失去焦点_WPF的TextBox的焦点获取与失去焦点的死循环解决方案

时间:2025-04-17 12:20:12

在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翻译】获取当前窗口焦点所在的元素