我在文本框中将IsTabStop设置为false,我知道这会使控件无法获得焦点,但根据Silverlight Forums,它应该仍然能够接收鼠标事件。我在我的tbxTotal_MouseLeftButtonUp方法中连接了MouseLeftButtonUp事件和断点,并且它在调试期间永远不会被命中。 SL论坛中的线程现在已经很老了,所以也许这在某个地方更新了。我想要一个无法选项卡的文本框,但仍然可以编辑。真的应该这么难吗?
答案 0 :(得分:3)
我没有意识到这一点,但似乎是这样,另外,我似乎无法让MouseLeftButtonUp开火。 MouseLeftButtonDown确实会触发并使用它来执行此操作。
<TextBox IsTabStop="False" MouseLeftButtonDown="TextBox_MouseLeftButtonDown" />
然后在代码中你可以像这样处理事件。
private void TextBox_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var textBox = ((TextBox) sender);
textBox.IsTabStop = true;
textBox.Focus();
textBox.IsTabStop = false;
}
将它包装在CustomControl
中可能是值得的public class FocusableTextBox : TextBox
{
protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
{
if (!IsTabStop)
{
IsTabStop = true;
Focus();
IsTabStop = false;
}
base.OnMouseLeftButtonDown(e);
}
}
答案 1 :(得分:1)
@seekerOfKnowledge:在IsTabStop
上停用LostFocus
是一种很好的方法,但重新关注黑客是不必要的。由于IsTabStop
的更改尚未生效,因此第一次没有任何可见效果。这种方法也可以与任何其他控制一起使用。
var control = sender as Control;
if (control != null)
{
control.MouseLeftButtonDown += (sender, args) =>
{ //This event fires even if the control isn't allowed focus.
//As long as the control is visible, it's typically hit-testable.
if (!control.IsTabStop)
{
control.IsTabStop = true;
//threading required so IsTabStop change can take effect before assigning focus
control.Dispatcher.BeginInvoke(() =>
{
control.Focus();
});
}
};
control.LostFocus += (sender, args) =>
{ //Remove IsTabStop once the user exits the control
control.IsTabStop = false;
};
}