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

本文介绍了在WPF中遇到的TextBox焦点获取和失去焦点的问题及解决方案。首次弹出层时TextBox无法获取焦点,通过DispatcherTimer实现延迟获取焦点。另外,当尝试在TextBox失去焦点时避免死循环,同样利用定时器来正确设置焦点,确保取消按钮可以正常工作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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未获取到焦点采用了定时器延时的方法,解决方案如下:

///

/// 定义个定时器

///

DispatcherTimer timer = new DispatcherTimer();

///

/// 构造方法

///

public MainUserContrl()

{

InitializeComponent();

timer.Interval = new TimeSpan();

timer.Tick += timer_Tick;

}

///

/// 定时器间隔执行方法

///

///

///

void timer_Tick(object sender, EventArgs e)

{

this.MainText.Focus();

timer.Stop();

}

///

/// 控制改用户控件显示隐藏的依赖属性

///

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在能使用的情况下不能失去焦点(除非点击弹出层的关闭按钮,让弹出层消失),初始实现代码如下:

///

/// textBox失去焦点事件

///

///

///

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();

};

///

///失去焦点事件

///

private void textBox_LostFocus(object sender, RoutedEventArgs e)

{

timerLoseFocuse.Start();

}

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值