Stopping an animation in WPF, dynamic loaded userc

2019-09-14 00:41发布

In my main window of the application:

public MainWindow() {
InitializeComponent();

Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => {
    var workingArea = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea;
    var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice;
    var corner = transform.Transform(new Point(workingArea.Right, workingArea.Bottom));

    this.Left = corner.X - this.ActualWidth - 100;
    this.Top = corner.Y - this.ActualHeight;
}));

NotificationWindow nw1 = new NotificationWindow();
spNotifiers.Children.Add(nw1);

}

My notifier looks like this:

<UserControl 
x:Class="NotificationWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Background="Transparent" MouseEnter="UserControl_MouseEnter">

<Grid RenderTransformOrigin="0,1">

    <Border BorderThickness="1" Background="Beige" BorderBrush="Black" CornerRadius="10">
        <StackPanel Margin="20">
            <TextBlock TextWrapping="Wrap" Margin="5"> 
      <Bold>Besked fra podio</Bold><LineBreak /><LineBreak /> 
      Her skal der være en podio notification!
            </TextBlock>
            <CheckBox Content="Check check" Margin="5 5 0 5" />
            <Button Content="Klik på mig" HorizontalAlignment="Center" />
        </StackPanel>
    </Border>

    <!-- Animation -->
    <Grid.Triggers>
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
            <BeginStoryboard>
                <Storyboard x:Name="sbMain">
                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)">
                        <SplineDoubleKeyFrame KeyTime="0:0:0" Value="0"/>
                        <SplineDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/>
                    </DoubleAnimationUsingKeyFrames>
                    <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
                        <SplineDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
                        <SplineDoubleKeyFrame KeyTime="0:0:4" Value="0"/>
                    </DoubleAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Grid.Triggers>

    <Grid.RenderTransform>
        <ScaleTransform ScaleY="1" />
    </Grid.RenderTransform>

</Grid>

private void UserControl_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e) {
sbMain.Stop(); // not working

}

From the notifier I have a mouse_anter event, that should stop the animation/storyboard, but no matter what I try I can't make the animation stop.

Any ideas ?

1条回答
兄弟一词,经得起流年.
2楼-- · 2019-09-14 00:42

I have found a solution but it requires to remove the Trigger.

Step1: Put your animation into "UserControl.Resources" and give it the attribute "x:Key=sbMain"

Step2: Add an event to UserControl Loaded

Step3: In code behind change "sbMain.Stop();" to "((Storyboard)FindResource("sbMain")).Stop();", may you have to add some using directives.

Step4: To the LoadEvent add "((Storyboard)FindResource("sbMain")).Begin();"

The result looks something like this:

<UserControl x:Class="NotificationWindow"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Background="Transparent" MouseEnter="UserControl_MouseEnter" Width="300" Height="200" Loaded="UserControl_Loaded">
<UserControl .Resources>
    <Storyboard x:Key="sbMain">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(ScaleTransform.ScaleY)" Storyboard.TargetName="AnimatedGrid">
            <SplineDoubleKeyFrame KeyTime="0:0:0" Value="0"/>
            <SplineDoubleKeyFrame KeyTime="0:0:0.5" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="AnimatedGrid">
            <SplineDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
            <SplineDoubleKeyFrame KeyTime="0:0:4" Value="0"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</UserControl .Resources>


<Grid RenderTransformOrigin="0,1" x:Name="AnimatedGrid">

    <Border BorderThickness="1" Background="Beige" BorderBrush="Black" CornerRadius="10">
        <StackPanel Margin="20">
            <TextBlock TextWrapping="Wrap" Margin="5"> 
  <Bold>Besked fra podio</Bold><LineBreak /><LineBreak /> 
  Her skal der være en podio notification!
            </TextBlock>
            <CheckBox Content="Check check" Margin="5 5 0 5" />
            <Button Content="Klik på mig" HorizontalAlignment="Center" />
        </StackPanel>
    </Border>

    <Grid.RenderTransform>
        <ScaleTransform ScaleY="1" />
    </Grid.RenderTransform>

</Grid>

and in code behind:

private void UserControl_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
    ((Storyboard)FindResource("sbMain")).Stop();
}

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
        ((Storyboard)FindResource("sbMain")).Begin();
}

this code worked in my case.

查看更多
登录 后发表回答