다음을 통해 공유


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 감속/가속 함수를 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 클래스의 새 instance 초기화합니다.

속성

AutoReverse

타임라인이 앞으로 반복을 완료한 후 반대 방향으로 재생되는지 여부를 나타내는 값을 가져오거나 설정합니다.

(다음에서 상속됨 Timeline)
BeginTime

타임라인 을 시작할 시간을 가져오거나 설정합니다.

(다음에서 상속됨 Timeline)
Dispatcher

항상 Windows 앱 SDK 앱에서 를 반환 null 합니다. 대신 DispatcherQueue 를 사용합니다.

(다음에서 상속됨 DependencyObject)
DispatcherQueue

DispatcherQueue 이 개체가 연결된 을 가져옵니다. 는 DispatcherQueue 코드가 비 UI 스레드에 의해 시작되는 경우에도 UI 스레드에서 에 액세스할 DependencyObject 수 있는 기능을 나타냅니다.

(다음에서 상속됨 DependencyObject)
Duration

반복을 제외하고 이 Timeline이 재생되는 시간을 가져오거나 설정합니다.

(다음에서 상속됨 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 instance 특정 DependencyProperty의 변경 내용을 수신 대기하기 위한 알림 함수를 등록합니다.

(다음에서 상속됨 DependencyObject)
SetValue(DependencyProperty, Object)

DependencyObject에서 종속성 속성의 로컬 값을 설정합니다.

(다음에서 상속됨 DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

RegisterPropertyChangedCallback을 호출하여 이전에 등록된 변경 알림을 취소합니다.

(다음에서 상속됨 DependencyObject)

이벤트

Completed

Storyboard 개체 재생이 완료되면 발생합니다.

(다음에서 상속됨 Timeline)

적용 대상

추가 정보