語言

UIElement.ReleasePointerCapture(Pointer) 方法

定義

UIElement 釋放指標擷取以捕捉特定指標。

public:
 virtual void ReleasePointerCapture(Pointer ^ value) = ReleasePointerCapture;
void ReleasePointerCapture(Pointer const& value);
public void ReleasePointerCapture(Pointer value);
function releasePointerCapture(value)
Public Sub ReleasePointerCapture (value As Pointer)

參數

value
Pointer

指標的參考。 可使用先前擷取中儲存的參考資料或指標事件資料來取得此參考資料。

範例

這個範例展示了基於處理 PointerReleased 來呼叫ReleasePointerCapture的過程。

它還顯示了初始擷取指標的程式碼,以及追蹤與計數指標參考的模式。

int _pointerCount;

public Scenario2()
{
    this.InitializeComponent();
    bEnteredExited.PointerEntered += bEnteredExited_PointerEntered;
    bEnteredExited.PointerExited += bEnteredExited_PointerExited;
    bEnteredExited.PointerPressed += bEnteredExited_PointerPressed;
    bEnteredExited.PointerReleased += bEnteredExited_PointerReleased;
    bEnteredExited.PointerMoved += bEnteredExited_PointerMoved;

    // To code for multiple Pointers (that is, fingers), 
    // we track how many entered/exited.
    _pointerCount = 0;
}

private void bEnteredExited_PointerMoved(object sender, 
    PointerRoutedEventArgs e)
{
    Scenario2UpdateVisuals(sender as Border, "Moved");
}

private void bEnteredExited_PointerReleased(object sender, 
    PointerRoutedEventArgs e)
{
    ((Border)sender).ReleasePointerCapture(e.Pointer);
    txtCaptureStatus.Text = string.Empty;
}

//Can only get capture on PointerPressed (i.e. touch down, mouse click, pen press)
private void bEnteredExited_PointerPressed(object sender, 
    PointerRoutedEventArgs e)
{
    if (tbPointerCapture.IsOn)
    {
        bool _hasCapture = ((Border)sender).CapturePointer(e.Pointer);
        txtCaptureStatus.Text = "Got Capture: " + _hasCapture;
    }
}

private void bEnteredExited_PointerExited(object sender, 
    PointerRoutedEventArgs e)
{
    _pointerCount--;
    Scenario2UpdateVisuals(sender as Border, "Exited");
}

private void bEnteredExited_PointerEntered(object sender, 
    PointerRoutedEventArgs e)
{
    _pointerCount++;
    Scenario2UpdateVisuals(sender as Border, "Entered");
}

private void Scenario2UpdateVisuals(Border border, 
    String eventDescription)
{
    switch (eventDescription.ToLower())
    {
        case "exited":
            if (_pointerCount <= 0)
            {
                border.Background = new SolidColorBrush(Colors.Red);
                bEnteredExitedTextBlock.Text = eventDescription;
            }
            break;
        case "moved":
            RotateTransform rt = 
                (RotateTransform)bEnteredExitedTimer.RenderTransform;
            rt.Angle += 2;
            if (rt.Angle > 360) rt.Angle -= 360;
            break;
        default:
            border.Background = new SolidColorBrush(Colors.Green);
            bEnteredExitedTextBlock.Text = eventDescription;
            break;
    }
}

private void Scenario2Reset(object sender, RoutedEventArgs e)
{
    Scenario2Reset();
}

private void Scenario2Reset()
{
    bEnteredExited.Background = new SolidColorBrush(Colors.Green);
    bEnteredExitedTextBlock.Text = string.Empty;
}

備註

程式化釋放指標擷取 ReleasePointerCapture 並非元素失去指標擷取的唯一方式。 例如,使用者驅動的事件,如放開指標(觸控點向上,滑鼠按鈕放開)可能導致指標擷取被取消。

你可以監聽 PointerCaptureLost事件來判斷何時發生。

另一種指標擷取可能被取消的情況是,指標從一個應用程式移到另一個應用程式,而這兩個應用程式並排存在。

只有當你的應用程式程式碼之前已經呼叫過 CapturePointer,並且有指向你想要釋放指標擷取的特定指標實例時,才應該呼叫ReleasePointerCapture。 你通常會透過像 PointerReleasedPointerMoved 這類活動獲得這個Pointer參考。

你的應用程式代碼 可能會呼叫來自 不同 UIElement,與目前有指標擷取的 UIElement 不同。 如果是這樣,這會抵銷其他元素先前所做的指標捕獲。

UIElement可以擷取多個指標來處理多個接觸點,例如用於操作,但應用程式中同一時間只能UIElement有一個指標被擷取。 更多資訊請參見 「Handle指標輸入」。

適用於

另請參閱