6

テキストボックスでIsTabStopをfalseに設定すると、コントロールがフォーカスを受信できなくなることがわかっていますが、Silverlightフォーラムによると、マウスイベントを受信できるはずです。MouseLeftButtonUpイベントが配線され、tbxTotal_MouseLeftButtonUpメソッドにブレークポイントがあり、デバッグ中にヒットすることはありません。SLフォーラムのスレッドはかなり古いので、おそらくこれはどこかのアップデートで変更されました。タブで移動できないが、編集可能なテキストボックスが必要です。本当にこれほど難しいのでしょうか?

4

2 に答える 2

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);
    }
}
于 2011-04-26T14:11:39.960 に答える
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;
                };
        }
于 2012-01-03T18:31:59.930 に答える