共用方式為


SwipeBackThemeAnimation 類別

定義

表示在 動互動之後,當元素投影回其版面配置位置時,套用至控制項的預先設定動畫。

public ref class SwipeBackThemeAnimation sealed : Timeline
/// [Windows.Foundation.Metadata.Activatable(65536, "Microsoft.UI.Xaml.WinUIContract")]
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class SwipeBackThemeAnimation final : Timeline
[Windows.Foundation.Metadata.Activatable(65536, "Microsoft.UI.Xaml.WinUIContract")]
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class SwipeBackThemeAnimation : Timeline
Public NotInheritable Class SwipeBackThemeAnimation
Inherits Timeline
<SwipeBackThemeAnimation ... />
繼承
Object Platform::Object IInspectable DependencyObject Timeline SwipeBackThemeAnimation
屬性

範例

下列範例會將 SineEase easing 函式套用至 DoubleAnimation ,以建立遞減動畫。

<!-- Example template of a custom control that supports swipe selection.  
     A SwipeBackThemeAnimation is run when the control goes to the Normal state. -->
-->
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:BlankApp1">

    <Style TargetType="local:SwipeControl" >
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:SwipeControl">
                    <Grid>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="SwipeStates">
                                <VisualState x:Name="Normal">
                                    <Storyboard>
                                        <SwipeBackThemeAnimation TargetName="contentRectangle"/>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Selected">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="SelectedText" 
                                            Storyboard.TargetProperty="Visibility">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Hinting">
                                    <Storyboard>
                                        <SwipeHintThemeAnimation TargetName="contentRectangle"/>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Rectangle Width="100" Height="100" Fill="{TemplateBinding Background}"/>

                        <Rectangle x:Name="contentRectangle"
                            Width="100" 
                            Height="100" 
                            Fill="{TemplateBinding Foreground}"/>
                        <TextBlock x:Name="SelectedText" 
                            Text="Selected" 
                            Visibility="Collapsed" 
                            Foreground="White" 
                            FontSize="20" 
                            VerticalAlignment="Center" 
                            HorizontalAlignment="Center"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
public sealed class SwipeControl : Control
{
    GestureRecognizer _gestureRecognizer;
    bool _isPointerDown = false;
    bool _isSelected = false;
    bool _isCrossSliding = false;

    public SwipeControl()
    {
        this.DefaultStyleKey = typeof(SwipeControl);
        // Direct gesture recognizer to recognize hold and swipe gestures.
        _gestureRecognizer = new GestureRecognizer();
        _gestureRecognizer.GestureSettings = GestureSettings.Hold | 
                                             GestureSettings.HoldWithMouse | 
                                             GestureSettings.CrossSlide;

        _gestureRecognizer.Holding += GestureRecognizer_Holding;
        _gestureRecognizer.CrossSlideHorizontally = false; // Support vertical swiping.
        _gestureRecognizer.CrossSliding += GestureRecognizer_CrossSliding;            
    }

    protected override void OnPointerPressed(PointerRoutedEventArgs e)
    {
        base.OnPointerPressed(e);
        _isPointerDown = CapturePointer(e.Pointer);
        // Send input to GestureRecognizer for processing.
        _gestureRecognizer.ProcessDownEvent(e.GetCurrentPoint(this));

    }

    protected override void OnPointerReleased(PointerRoutedEventArgs e)
    {
        base.OnPointerReleased(e);
        // Send input to GestureRecognizer for processing.
        _gestureRecognizer.ProcessUpEvent(e.GetCurrentPoint(this));

        _isCrossSliding = false;

        // Go to Normal state when pointer is released.
        if (!_isSelected)
        {
            VisualStateManager.GoToState(this, "Normal", true);
        }
    }

    protected override void OnPointerMoved(PointerRoutedEventArgs e)
    {
        base.OnPointerMoved(e);
        if (_isPointerDown)
        {
            // Send input to GestureRecognizer for processing.
            _gestureRecognizer.ProcessMoveEvents(e.GetIntermediatePoints(this));
        }
    }

    void GestureRecognizer_Holding(GestureRecognizer sender, HoldingEventArgs args)
    {
        // Go to Hinting state if control is not already selected.
        if (!_isSelected)
        {
            VisualStateManager.GoToState(this, "Hinting", true);
        }
    }

    void GestureRecognizer_CrossSliding(GestureRecognizer sender, CrossSlidingEventArgs args)
    {
        // Prevent multiple state changes for the same swipe gesture.
        if (!_isCrossSliding)
        {
            _isCrossSliding = true;                

            // Toggle between Selected and Normal on swipe gesture.
            _isSelected = !_isSelected;
            if (_isSelected)
            {
                VisualStateManager.GoToState(this, "Selected", true);
            }
            else
            {
                VisualStateManager.GoToState(this, "Normal", true);
            }
        }
    }
}
// SwipeControl.h:
struct SwipeControl : SwipeControlT<SwipeControl>
{
    SwipeControl();

    void OnPointerPressed(Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e);
    void OnPointerReleased(Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e);
    void OnPointerMoved(Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e);

private:
    Windows::UI::Input::GestureRecognizer m_gestureRecognizer;
    bool m_isPointerDown;
    bool m_isSelected;
    bool m_isCrossSliding;

    void GestureRecognizer_Holding(Windows::UI::Input::GestureRecognizer const& sender, Windows::UI::Input::HoldingEventArgs const& args);
    void GestureRecognizer_CrossSliding(Windows::UI::Input::GestureRecognizer const& sender, Windows::UI::Input::CrossSlidingEventArgs const& args);
};

// SwipeControl.cpp:
SwipeControl::SwipeControl() : m_isCrossSliding(false), m_isPointerDown(false), m_isSelected(false)
{
    DefaultStyleKey(winrt::box_value(L"DocsCppWinRT.SwipeControl"));

    m_gestureRecognizer.GestureSettings(
        Windows::UI::Input::GestureSettings::Hold |
        Windows::UI::Input::GestureSettings::HoldWithMouse |
        Windows::UI::Input::GestureSettings::CrossSlide);

    m_gestureRecognizer.Holding({ this, &SwipeControl::GestureRecognizer_Holding });
    m_gestureRecognizer.CrossSlideHorizontally(false); // Support vertical swiping.
    m_gestureRecognizer.CrossSliding({ this, &SwipeControl::GestureRecognizer_CrossSliding });
}

void SwipeControl::OnPointerPressed(Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e)
{
    m_isPointerDown = CapturePointer(e.Pointer());
    // Send input to GestureRecognizer for processing.
    m_gestureRecognizer.ProcessDownEvent(e.GetCurrentPoint(*this));
}

void SwipeControl::OnPointerReleased(Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e)
{
    // Send input to GestureRecognizer for processing.
    m_gestureRecognizer.ProcessUpEvent(e.GetCurrentPoint(*this));

    m_isCrossSliding = false;

    // Go to Normal state when pointer is released.
    if (!m_isSelected)
    {
        Windows::UI::Xaml::VisualStateManager::GoToState(*this, L"Normal", true);
    }
}

void SwipeControl::OnPointerMoved(Windows::UI::Xaml::Input::PointerRoutedEventArgs const& e)
{
    if (m_isPointerDown)
    {
        // Send input to GestureRecognizer for processing.
        m_gestureRecognizer.ProcessMoveEvents(e.GetIntermediatePoints(*this));
    }
}

void SwipeControl::GestureRecognizer_Holding(Windows::UI::Input::GestureRecognizer const& /* sender */,
    Windows::UI::Input::HoldingEventArgs const& /* args */)
{
    // Go to Hinting state if control is not already selected.
    if (!m_isSelected)
    {
        Windows::UI::Xaml::VisualStateManager::GoToState(*this, L"Hinting", true);
    }
}

void SwipeControl::GestureRecognizer_CrossSliding(Windows::UI::Input::GestureRecognizer const& /* sender */,
    Windows::UI::Input::CrossSlidingEventArgs const& /* args */)
{
    // Prevent multiple state changes for the same swipe gesture.
    if (!m_isCrossSliding)
    {
        m_isCrossSliding = true;

        // Toggle between Selected and Normal on swipe gesture.
        m_isSelected = !m_isSelected;
        if (m_isSelected)
        {
            Windows::UI::Xaml::VisualStateManager::GoToState(*this, L"Selected", true);
        }
        else
        {
            Windows::UI::Xaml::VisualStateManager::GoToState(*this, L"Normal", true);
        }
    }
}
// SwipeControl.h:
public ref class SwipeControl sealed : public Windows::UI::Xaml::Controls::Control
{
public:
    SwipeControl();

protected:
    virtual void OnPointerPressed(Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e) override;
    virtual void OnPointerReleased(Windows::UI::Xaml::Input::PointerRoutedEventArgs^ e) override;
    virtual void OnPointerMoved(Windows::UI::Xaml::Input:: PointerRoutedEventArgs^ e) override;

private:
    Windows::UI::Input::GestureRecognizer^     m_gestureRecognizer;
    bool                                       m_isPointerDown;
    bool                                       m_isSelected;
    bool                                       m_isCrossSliding;

    void GestureRecognizer_Holding(Windows::UI::Input::GestureRecognizer^ sender,    
        Windows::UI::Input::HoldingEventArgs^ args);
    void GestureRecognizer_CrossSliding(Windows::UI::Input::GestureRecognizer^ sender, 
        Windows::UI::Input::CrossSlidingEventArgs^ args);
};

// SwipeControl.cpp:
SwipeControl::SwipeControl() : m_isCrossSliding(false), m_isPointerDown(false), m_isSelected(false)
{
    DefaultStyleKey = "DocsCPP.SwipeControl";

    m_gestureRecognizer = ref new GestureRecognizer();
    m_gestureRecognizer->GestureSettings = GestureSettings::Hold | 
                                              GestureSettings::HoldWithMouse | 
                                              GestureSettings::CrossSlide;

    m_gestureRecognizer->Holding::add(ref new TypedEventHandler<GestureRecognizer^, 
        HoldingEventArgs^>(this, &SwipeControl::GestureRecognizer_Holding));
    m_gestureRecognizer->CrossSlideHorizontally = false; // Support vertical swiping.
    m_gestureRecognizer->CrossSliding::add(ref new TypedEventHandler<GestureRecognizer^, 
        CrossSlidingEventArgs^>(this, &SwipeControl::GestureRecognizer_CrossSliding));
}

void SwipeControl::OnPointerPressed(PointerRoutedEventArgs^ e)
{
    m_isPointerDown = CapturePointer(e->Pointer);
    // Send input to GestureRecognizer for processing.
    m_gestureRecognizer->ProcessDownEvent(e->GetCurrentPoint(this));
}

void SwipeControl::OnPointerReleased(PointerRoutedEventArgs^ e)
{
    // Send input to GestureRecognizer for processing.
    m_gestureRecognizer->ProcessUpEvent(e->GetCurrentPoint(this));

    m_isCrossSliding = false;

    // Go to Normal state when pointer is released.
    if (!m_isSelected)
    {
        VisualStateManager::GoToState(this, "Normal", true);
    }
}

void SwipeControl::OnPointerMoved(PointerRoutedEventArgs^ e)
{
    if (m_isPointerDown)
    {
        // Send input to GestureRecognizer for processing.
        m_gestureRecognizer->ProcessMoveEvents(e->GetIntermediatePoints(this));
    }
}

void SwipeControl::GestureRecognizer_Holding(GestureRecognizer^ sender, HoldingEventArgs^ args)
{
    // Go to Hinting state if control is not already selected.
    if (!m_isSelected)
    {
        VisualStateManager::GoToState(this, "Hinting", true);
    }
}

void SwipeControl::GestureRecognizer_CrossSliding(GestureRecognizer^ sender, CrossSlidingEventArgs^ args)
{
    // Prevent multiple state changes for the same swipe gesture.
    if (!m_isCrossSliding)
    {
        m_isCrossSliding = true;                

        // Toggle between Selected and Normal on swipe gesture.
        m_isSelected = !m_isSelected;
        if (m_isSelected)
        {
            VisualStateManager::GoToState(this, "Selected", true);
        }
        else
        {
            VisualStateManager::GoToState(this, "Normal", true);
        }
    } 
}

備註

請注意,設定 Duration 屬性不會影響此物件,因為預先設定持續時間。

建構函式

SwipeBackThemeAnimation()

初始化 SwipeBackThemeAnimation 類別的新實例。

屬性

AutoReverse

取得或設定值,其中該值指出時間軸是否會在完成向前反覆項目後反向播放。

(繼承來源 Timeline)
BeginTime

取得或設定這個 時間軸 應該開始的時間。

(繼承來源 Timeline)
Dispatcher

一律會在 null Windows 應用程式 SDK應用程式中傳回。 請改用 DispatcherQueue

(繼承來源 DependencyObject)
DispatcherQueue

DispatcherQueue取得與這個 物件相關聯的 。 DispatcherQueue表示即使程式碼是由非 UI 執行緒起始,也可以存取 DependencyObject UI 執行緒上的 。

(繼承來源 DependencyObject)
Duration

取得或設定這個時間表播放的時間長度 (不計算重複次數)。

(繼承來源 Timeline)
FillBehavior

取得或設定值,指定動畫在到達其使用期間結束時的行為。

(繼承來源 Timeline)
FromHorizontalOffset

取得或設定當動畫使用中時,目標在水準方向轉譯的距離。

FromHorizontalOffsetProperty

識別 FromHorizontalOffset 相依性屬性。

FromVerticalOffset

取得或設定當動畫使用中時,目標在垂直方向轉譯的距離。

FromVerticalOffsetProperty

識別 FromHorizontalOffset 相依性屬性。

RepeatBehavior

取得或設定這個時間軸的重複行為。

(繼承來源 Timeline)
SpeedRatio

取得或設定相對於其父系的速率,此時會進行這個 時間軸

(繼承來源 Timeline)
TargetName

取得或設定目標控制項專案的參考名稱。

TargetNameProperty

識別 TargetName 相依性屬性。

方法

ClearValue(DependencyProperty)

清除相依性屬性的本機值。

(繼承來源 DependencyObject)
GetAnimationBaseValue(DependencyProperty)

傳回針對相依性屬性所建立的任何基底值,如果動畫未使用中,則會套用。

(繼承來源 DependencyObject)
GetValue(DependencyProperty)

DependencyObject傳回相依性屬性的目前有效值。

(繼承來源 DependencyObject)
ReadLocalValue(DependencyProperty)

如果已設定本機值,則傳回相依性屬性的本機值。

(繼承來源 DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

註冊通知函式,以接聽此DependencyObject實例上特定DependencyProperty的變更。

(繼承來源 DependencyObject)
SetValue(DependencyProperty, Object)

DependencyObject上設定相依性屬性的本機值。

(繼承來源 DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

取消先前透過呼叫 RegisterPropertyChangedCallback註冊的變更通知。

(繼承來源 DependencyObject)

事件

Completed

發生于 Storyboard 物件已完成播放時。

(繼承來源 Timeline)

適用於

另請參閱