SL4文本框上的IsTabStop = False

时间:2011-04-26 13:59:36

标签: silverlight silverlight-4.0 tabstop

我在文本框中将IsTabStop设置为false,我知道这会使控件无法获得焦点,但根据Silverlight Forums,它应该仍然能够接收鼠标事件。我在我的tbxTotal_MouseLeftButtonUp方法中连接了MouseLeftButtonUp事件和断点,并且它在调试期间永远不会被命中。 SL论坛中的线程现在已经很老了,所以也许这在某个地方更新了。我想要一个无法选项卡的文本框,但仍然可以编辑。真的应该这么难吗?

2 个答案:

答案 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;
                };
        }