Custom ToggleButton不响应ManipulationCompleted事件

时间:2017-08-28 19:18:50

标签: c# wpf

我有一个继承自System.Windows.Controls.Primitives.ToggleButton的自定义UI元素。我也通过自定义TouchDevice路由我的鼠标事件,而不是引发触摸事件。

由于某种原因,ManipulationCompleted事件永远不会发生。首先,可以在此处找到自定义TouchDevice:http://blakenui.codeplex.com/SourceControl/changeset/view/67526#Blake.NUI.WPF/Touch/MouseTouchDevice.cs

以下是我班级的相关部分:

public class ToggleSwitch: ToggleButton {

    private Grid _root;
    private readonly IList<int> _activeTouchDevices;
    private const double UNCHECKED_TRANSLATION = 0;

    private TranslateTransform _backgroundTranslation;
    private TranslateTransform _thumbTranslation;
    private Grid _root;
    private Grid _track;
    private FrameworkElement _thumb;
    private double _checkedTranslation;
    private double _dragTranslation;
    private bool _wasDragged;
    private bool _isDragging;

    public override void OnApplyTemplate()
    {
            ...
            MouseTouchDevice.RegisterEvents(_root);

            _root.IsManipulationEnabled = true;
            _root.TouchDown += OnTouchDown;
            _root.TouchUp += OnTouchUp;
            _root.GotTouchCapture += OnGotTouchCapture;
            _root.LostTouchCapture += OnLostTouchCapture;

            _root.ManipulationStarted += OnManipulationStarted;
            _root.ManipulationDelta += OnManipulationDelta;
            _root.ManipulationCompleted += OnManipulationCompleted;
    }

    private void OnTouchDown(object sender, TouchEventArgs e)
    {
        e.TouchDevice.Capture(_root);
    }

    private void OnGotTouchCapture(object sender, TouchEventArgs e)
    {
        if (e.TouchDevice.Captured == _root)
        {
            Manipulation.AddManipulator(_root,e.TouchDevice);
            _activeTouchDevices.Add(e.TouchDevice.Id);
        }
    }

    private void OnManipulationStarted(object sender, ManipulationStartedEventArgs e)
    {
        e.Handled = true;
        _isDragging = true;
        _dragTranslation = Translation;
        ChangeVisualState(true);
        Translation = _dragTranslation;
    }

    private void OnManipulationDelta(object sender, ManipulationDeltaEventArgs e)
    {
        e.Handled = true;
        var horizontalChange = e.DeltaManipulation.Translation.X;
        var direction = Math.Abs(horizontalChange) >= Math.Abs(e.DeltaManipulation.Translation.Y) ? Orientation.Horizontal : Orientation.Vertical;
        if (direction == Orientation.Horizontal && horizontalChange != 0.0)
        {
            _wasDragged = true;
            _dragTranslation += horizontalChange;
            Translation = Math.Max(UNCHECKED_TRANSLATION, Math.Min(_checkedTranslation, _dragTranslation));
        }
    }

    private void OnManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
    {
        e.Handled = true;
        _isDragging = false;
        var click = false;
        if (_wasDragged)
        {
            var edge = (IsChecked ?? false) ? _checkedTranslation : UNCHECKED_TRANSLATION;
            if (Translation != edge)
            {
                click = true;
            }
        }
        else
        {
            click = true;
        }
        if (click)
        {
            OnClick();
        }

        _wasDragged = false;
    }

}

永远不会输入OnManipulationCompleted方法。

0 个答案:

没有答案