wpf鼠标捕获和焦点问题

我有一个userrcontrol内的文本框。 Usercopntrol有一个类型为String的Dependency属性“Text”。 usercontrol的Text属性绑定到TextBoxes Text属性。

public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
        "Text",
        typeof(String),
        typeof(MyTextControl),
        new FrameworkPropertyMetadata(String.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

xaml代码...

<TextBox
            x:Name="textbox1"
            Text="{Binding ElementName=MyTextControl, Path=Text, UpdateSourceTrigger=LostFocus}"
            ...
</TextBox>

请注意我们的应用程序中存在的原因是UpdateSourceTrigger是LostFocus而不是PropertyChanged,以提供“撤消”功能。 当焦点丢失时,文本更改将创建撤消步骤。

现在有一种情况是,用户在应用程序内部的另一个控件上单击Usercontrol之外。 那么“FocusLost”事件不会被wpf系统触发。 因此,我使用了

Mouse.PreviewMouseDownOutsideCapturedElement   

在这种情况下,这对于更新有用。

要捕获此事件,需要在文本更改时设置鼠标捕获,并在发生点击时释放捕获。

private void OnTextBoxTextChanged(object sender, TextChangedEventArgs e)
{
    Mouse.Capture(sender as IInputElement);
}

private void OnPreviewMouseDownOutsideCapturedElement(object sender, MouseButtonEventArgs args)
    {
        var result= VisualTreeHelper.HitTest(this, args.GetPosition(this));
        if (result!= null)
        {
            // clicked inside of usercontrol, can keep capture, no work!
        }
        else
        {
            // outside of usercontrol, now store the text!
            if (_textbox != null)
            {
                _textbox.ReleaseMouseCapture();

                // do other text formatting stuff

                // assign the usercontrols dependency property by the current text
                Text = _textbox.Text;
            }
         }
      }

当这个机制被实现时,用户点击文本框旁边的某个地方,它发现像其他UIElement的PreviewGotKeyboardFocus这样的隧道事件不会因为捕获而被解雇。

private void OnPreviewGotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
    {
        // never gets called!
        Debug.WriteLine("   OnPreviewGotKeyboardFocus"); 
    }

我如何确保此机制不会阻止其他单击元素的PreviewGotKeyboardFocus事件?

链接地址: http://www.djcxy.com/p/44935.html

上一篇: wpf mouse capture and focus issue

下一篇: TextBox Leave Event suppresses Button Click