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