Bagikan melalui


SwipeBackThemeAnimation Kelas

Definisi

Mewakili animasi yang telah dikonfigurasi sebelumnya yang berlaku untuk kontrol saat elemen meluncur kembali ke slot tata letaknya setelah interaksi Geser .

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 ... />
Warisan
Object Platform::Object IInspectable DependencyObject Timeline SwipeBackThemeAnimation
Atribut

Contoh

Contoh berikut menerapkan fungsi pelonggaran SineEase ke DoubleAnimation untuk membuat animasi yang menurun.

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

Keterangan

Perhatikan bahwa pengaturan properti Durasi tidak berpengaruh pada objek ini karena durasi telah dikonfigurasi sebelumnya.

Konstruktor

SwipeBackThemeAnimation()

Menginisialisasi instans baru kelas SwipeBackThemeAnimation .

Properti

AutoReverse

Mendapatkan atau menetapkan nilai yang menunjukkan apakah garis waktu diputar secara terbalik setelah menyelesaikan perulangan ke depan.

(Diperoleh dari Timeline)
BeginTime

Mendapatkan atau mengatur waktu di mana Garis Waktu ini harus dimulai.

(Diperoleh dari Timeline)
Dispatcher

Selalu kembali null di aplikasi SDK Aplikasi Windows. Gunakan DispatcherQueue sebagai gantinya.

(Diperoleh dari DependencyObject)
DispatcherQueue

DispatcherQueue Mendapatkan yang dikaitkan dengan objek ini. DispatcherQueue mewakili fasilitas yang dapat mengakses DependencyObject pada utas UI bahkan jika kode dimulai oleh utas non-UI.

(Diperoleh dari DependencyObject)
Duration

Mendapatkan atau mengatur lamanya waktu diputarnya garis waktu ini, tidak menghitung pengulangan.

(Diperoleh dari Timeline)
FillBehavior

Mendapatkan atau menetapkan nilai yang menentukan bagaimana animasi berperilaku setelah mencapai akhir periode aktifnya.

(Diperoleh dari Timeline)
FromHorizontalOffset

Mendapatkan atau mengatur jarak di mana target diterjemahkan ke arah horizontal saat animasi aktif.

FromHorizontalOffsetProperty

Mengidentifikasi properti dependensi FromHorizontalOffset .

FromVerticalOffset

Mendapatkan atau mengatur jarak di mana target diterjemahkan ke arah vertikal saat animasi aktif.

FromVerticalOffsetProperty

Mengidentifikasi properti dependensi FromHorizontalOffset .

RepeatBehavior

Mendapatkan atau mengatur perilaku berulang dari garis waktu ini.

(Diperoleh dari Timeline)
SpeedRatio

Mendapatkan atau menetapkan tarif, relatif terhadap induknya, pada saat itu berlangsung untuk Garis Waktu ini.

(Diperoleh dari Timeline)
TargetName

Mendapatkan atau mengatur nama referensi elemen kontrol yang ditargetkan.

TargetNameProperty

Mengidentifikasi properti dependensi TargetName .

Metode

ClearValue(DependencyProperty)

Menghapus nilai lokal properti dependensi.

(Diperoleh dari DependencyObject)
GetAnimationBaseValue(DependencyProperty)

Mengembalikan nilai dasar apa pun yang ditetapkan untuk properti dependensi, yang akan berlaku dalam kasus di mana animasi tidak aktif.

(Diperoleh dari DependencyObject)
GetValue(DependencyProperty)

Mengembalikan nilai efektif properti dependensi saat ini dari DependencyObject.

(Diperoleh dari DependencyObject)
ReadLocalValue(DependencyProperty)

Mengembalikan nilai lokal properti dependensi, jika nilai lokal ditetapkan.

(Diperoleh dari DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

Mendaftarkan fungsi pemberitahuan untuk mendengarkan perubahan pada DependencyProperty tertentu pada instans DependencyObject ini.

(Diperoleh dari DependencyObject)
SetValue(DependencyProperty, Object)

Mengatur nilai lokal properti dependensi pada DependencyObject.

(Diperoleh dari DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

Membatalkan pemberitahuan perubahan yang sebelumnya terdaftar dengan memanggil RegisterPropertyChangedCallback.

(Diperoleh dari DependencyObject)

Acara

Completed

Terjadi ketika objek Storyboard telah selesai diputar.

(Diperoleh dari Timeline)

Berlaku untuk

Lihat juga