/// <summary> /// Returns a ManipulationDevice associated with the given UIElement. /// </summary> /// <param name="element">The target of the ManipulationDevice.</param> /// <returns> /// A ManipulationDevice associated with the element. /// If a device already exists for the element, a reference to that instance /// will be returned, otherwise a new instance will be created. /// </returns> /// <remarks> /// This function is thread-safe but should be called only on the /// same thread that 'element' is bound to, due to possibly calling /// the ManipulationDevice constructor. /// </remarks> internal static ManipulationDevice AddManipulationDevice(UIElement element) { Debug.Assert(element != null, "element should be non-null."); element.VerifyAccess(); ManipulationDevice device = GetManipulationDevice(element); if (device == null) { if (_manipulationDevices == null) { _manipulationDevices = new Dictionary<UIElement, ManipulationDevice>(2); } device = new ManipulationDevice(element); _manipulationDevices[element] = device; } return device; }