@NNn131

Как работать с wpf анимацией?

Захотелось мне сделать красивый эффект уведомления. Это должна быть надпись, которая поднимается вверх, постепенно становясь прозрачной. Я пытаюсь сделать эту надпись через user control с label внутри
В идеале - я просто создаю объект надписи и он автоматически запускает свою анимацию и по её окончании удаляется.
Вопросы:
0: Чем отличаются Parent, VisualParent?
1: Как двигать объект? Как получить и установить его позицию (относительно родителя/окна)?
(Вроде можно это сделать с помощью Margin, но кажется это костыльно, нет?)
2: Как удалить объект изнутри себя же?
  • Вопрос задан
  • 86 просмотров
Пригласить эксперта
Ответы на вопрос 1
Casper-SC
@Casper-SC
Программист (.NET)
При её нажатии на кнопку снизу всплывает надпись и исчезает. В контрол можно поместить, что угодно, не только текст. Остальной код в комментариях.

MainWindow.xaml.cs
using System.Windows;

namespace Notification
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OnButtonClick(object sender, RoutedEventArgs e)
        {
            _notification.Activate();
        }
    }
}


Controls/NotificationControl.cs
using System.Windows;
using System.Windows.Controls;

namespace Notification.Controls
{
    public class NotificationControl : ContentControl
    {
        public NotificationControl()
        {
            DefaultStyleKey = typeof(NotificationControl);
        }

        public void Activate()
        {
            VisualStateManager.GoToState(this, "Default", false);
            VisualStateManager.GoToState(this, "Activated", true);
        }
    }
}


Resources/Styles.xaml
<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:controls="clr-namespace:Notification.Controls">

    <KeyTime x:Key="OffsetYKeyTime">0:0:0.8</KeyTime>
    <KeyTime x:Key="OpacityDelayKeyTime">0:0:1.8</KeyTime>
    <KeyTime x:Key="VisibilityDelayKeyTime">0:0:2.2</KeyTime>
    <Style TargetType="controls:NotificationControl">
        <Setter Property="HorizontalContentAlignment" Value="Center" />
        <Setter Property="VerticalContentAlignment" Value="Center" />
        <Setter Property="HorizontalAlignment" Value="Stretch" />
        <Setter Property="VerticalAlignment" Value="Stretch" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="controls:NotificationControl">
                    <Border
                        x:Name="RootElement"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        Opacity="0"
                        Visibility="Collapsed">
                        <ContentPresenter
                            x:Name="ContentPresenter"
                            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
                            <ContentPresenter.RenderTransform>
                                <TransformGroup>
                                    <TranslateTransform />
                                    <RotateTransform />
                                </TransformGroup>
                            </ContentPresenter.RenderTransform>
                        </ContentPresenter>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Default">
                                    <Storyboard>

                                        <DoubleAnimationUsingKeyFrames
                                            Storyboard.TargetName="ContentPresenter"
                                            Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.Y)">
                                            <EasingDoubleKeyFrame
                                                KeyTime="0:0:0"
                                                Value="0">
                                            </EasingDoubleKeyFrame>
                                        </DoubleAnimationUsingKeyFrames>

                                        <DoubleAnimationUsingKeyFrames
                                            Storyboard.TargetName="RootElement"
                                            Storyboard.TargetProperty="Opacity">
                                            <EasingDoubleKeyFrame
                                                KeyTime="0:0:0"
                                                Value="1">
                                            </EasingDoubleKeyFrame>
                                        </DoubleAnimationUsingKeyFrames>

                                        <ObjectAnimationUsingKeyFrames
                                            Storyboard.TargetName="RootElement"
                                            Storyboard.TargetProperty="Visibility">
                                            <DiscreteObjectKeyFrame KeyTime="0:0:0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Visible</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>

                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Activated">
                                    <Storyboard>

                                        <DoubleAnimationUsingKeyFrames
                                            Storyboard.TargetName="ContentPresenter"
                                            Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(TranslateTransform.Y)">
                                            <EasingDoubleKeyFrame
                                                KeyTime="0:0:0"
                                                Value="0">
                                                <EasingDoubleKeyFrame.EasingFunction>
                                                    <QuadraticEase EasingMode="EaseOut" />
                                                </EasingDoubleKeyFrame.EasingFunction>
                                            </EasingDoubleKeyFrame>
                                            <EasingDoubleKeyFrame
                                                KeyTime="{StaticResource OffsetYKeyTime}"
                                                Value="-80">
                                                <EasingDoubleKeyFrame.EasingFunction>
                                                    <QuadraticEase EasingMode="EaseOut" />
                                                </EasingDoubleKeyFrame.EasingFunction>
                                            </EasingDoubleKeyFrame>
                                        </DoubleAnimationUsingKeyFrames>

                                        <DoubleAnimationUsingKeyFrames
                                            Storyboard.TargetName="RootElement"
                                            Storyboard.TargetProperty="Opacity">
                                            <EasingDoubleKeyFrame
                                                KeyTime="0:0:0"
                                                Value="1">
                                                <EasingDoubleKeyFrame.EasingFunction>
                                                    <QuadraticEase EasingMode="EaseInOut" />
                                                </EasingDoubleKeyFrame.EasingFunction>
                                            </EasingDoubleKeyFrame>
                                            <EasingDoubleKeyFrame
                                                KeyTime="{StaticResource OpacityDelayKeyTime}"
                                                Value="0">
                                                <EasingDoubleKeyFrame.EasingFunction>
                                                    <QuadraticEase EasingMode="EaseInOut" />
                                                </EasingDoubleKeyFrame.EasingFunction>
                                            </EasingDoubleKeyFrame>
                                        </DoubleAnimationUsingKeyFrames>

                                        <ObjectAnimationUsingKeyFrames
                                            Storyboard.TargetName="RootElement"
                                            Storyboard.TargetProperty="Visibility">
                                            <DiscreteObjectKeyFrame KeyTime="0:0:0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Visible</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                            <DiscreteObjectKeyFrame KeyTime="{StaticResource VisibilityDelayKeyTime}">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Collapsed</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>

                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы