UIElement.CapturePointer(Pointer) 方法

定義

設定 UIElement的指標擷取。 擷取之後,只有具有擷取的專案才會引發指標相關事件。

public:
 virtual bool CapturePointer(Pointer ^ value) = CapturePointer;
bool CapturePointer(Pointer const& value);
public bool CapturePointer(Pointer value);
function capturePointer(value)
Public Function CapturePointer (value As Pointer) As Boolean

參數

value
Pointer

指標物件參考。

傳回

Boolean

bool

true 如果物件具有指標擷取,則為 ;否則為 false

範例

此範例示範根據處理PointerPressed呼叫 CapturePointer 。 它也會顯示追蹤和計算指標參考的模式。

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;
}

備註

如果指標處於按下狀態,則您只能成功擷取指標, (Pointer.IsInContact 應該 true) 。 實際構成的內容會根據按下的指標裝置類型而有所不同, (按下滑鼠按鍵、觸控點向下、連絡人中的手寫筆) 。 如果您嘗試擷取未按下的指標,或先前按下指標但已放開的位置,CapturePointer 會傳 false 回 。 現有擷取不會受到 CapturePointerfalse 回 的呼叫影響。

您通常會擷取 PointerPressed 事件處理常式內的指標。 您從處理常式的PointerRoutedEventArgs事件資料 PointerPressed 取得的Pointer實例是您從處理常式程式碼內呼叫 CapturePointer 時,應該為 value 參數傳遞的值。

您通常會擷取指標,因為您想要目前的指標動作在應用程式中起始行為。 在此情況下,您通常不希望其他元素處理來自該指標動作的任何其他事件,直到您的行為完成或釋放指標擷取來取消為止。 如果擷取指標,則只有已擷取的專案會取得指標的輸入事件,而其他元素也不會引發事件,即使指標移至其界限也一樣。 例如,請考慮具有兩個相鄰元素的 UI。 一般而言,如果您將指標從某個元素移到另一個專案,您必須先從第一個專案取得 PointerMoved 事件,然後再從第二個專案取得。 但是,如果第一個專案已擷取指標,則即使擷取的指標離開其界限,第一個專案仍會繼續接收 PointerMoved 事件。 此外,當擷取的指標進入指標時,第二個專案不會引發擷取指標的 PointerEntered 事件。

指標擷取狀態,並產生與指標擷取相關的事件,完全不是應用程式程式碼。 如果使用者放開指標,則會產生 PointerReleased 事件,且指標擷取與該指標相關聯的指標會遺失。 這也會在原始擷取專案上引發 PointerCaptureLost

在大部分情況下,當使用者完成輸入動作以釋放先前指標擷取的輸入動作時,會自動釋放指標擷取, (移動觸控點、釋放滑鼠左鍵、將手寫筆從範圍) 。 另一個可能釋放擷取的條件是也會引發 PointerCanceled 事件的任何動作。 您的應用程式通常依賴與使用者輸入動作相關聯的擷取發行行為,而不需要特別使用 ReleasePointerCaptureReleasePointerCaptures取消指標擷取。 如需詳細資訊,請參閱互動

如果已擷取指標,方法 CapturePointer 會傳回 false

UIElement可以一次擷取多個指標點。 value使用 參數來指出您想要擷取的指標實例。

代表手勢的輸入事件 (,例如 TappedDoubleTapped) 通常會在放開指標之後引發,因此您不應該嘗試在事件處理常式中擷取手勢事件的指標。 不允許筆勢事件的事件資料中的 指標 參考起始指標擷取。

提示

請勿嘗試在指標相關的輸入事件處理常式範圍之外使用 CapturePointer 。 除非您有一個您確定的 指標 與允許在該時間有指標擷取的指標相關聯,否則您的 CapturePointer 呼叫不會有任何作用。 沒有任何實際的方法可以使用新的指標產生新的 Pointer 和 呼叫 CapturePointer 。 您應該只使用 Pointer 系統透過指標相關輸入事件的事件資料提供給您的參考。

適用於

另請參閱