Forum: PC-Programmierung C# WPF PopUp animiertes UserControl als Child


von MikroMakro (Gast)


Lesenswert?

Hallo Gemeinde,

ich habe ein UserControl in einem PopUp eingebettet.
1
        <Popup  Name="popu" Placement="Right" PlacementTarget="{Binding ElementName=bt1}" PopupAnimation="Fade" AllowsTransparency="True" >
2
            <StackPanel Orientation="Vertical">
3
                <Label Name="lclose" Width="30" HorizontalAlignment="Right" Content="X" Background="Red" MouseLeftButtonDown="lclose_MouseLeftButtonDown"/>
4
                <local:UserControl1/>
5
            </StackPanel>
6
        </Popup>
7
8
        <Label Width="100" Height="100" Background="Black" Name="bt1" MouseEnter="popu_MouseEnter"/>

Das UserControl ist eine Grafikanimation, welche als BusyIndicator 
arbeiten soll.

Das funktioniert auch soweit.
Als Funktionstest bewege ich den Mauszeiger über ein Label.
1
        private void popu_MouseEnter(object sender, MouseEventArgs e)
2
        {
3
            popu.IsOpen = true;
4
        }

Das PopUp öffnet sich, die Animation ist aktiv.


Das PopUp wird per click wieder geschlossen
1
        private void lclose_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
2
        {
3
            popu.IsOpen = false;
4
        }

Bewege ich den Mauszeiger ein weiteres Mal über das Label, öffnet sich 
das PopUp und die Animation ist aktiv. NUR -> die Animation läuft nun 
langsamer.
Je öfter ich dies tue, desto langsamer wird die Animation.


Kann hier jemand weiterhelfen?

Danke&Gruß
Kerno

von Ecki (Gast)


Lesenswert?

Das PopUp finde ich erst einmal unauffällig, weshalb ich im UserControl 
weitersuchen würde.

Könntest du den Code des UserControls auch noch posten?

Falls die Animation eine WPF-Animation mit Storyboard, Trigger usw. ist, 
würde ich auch mal probieren, ob das PopupAnimation-Attibut einen 
Einfluss hat. Sollte nicht, aber mit WPF habe ich schon einiges 
erlebt... ;)

von MikroMakro (Gast)


Angehängte Dateien:

Lesenswert?

>Falls die Animation eine WPF-Animation mit Storyboard, Trigger usw. ist,
>würde ich auch mal probieren, ob das PopupAnimation-Attibut einen
>Einfluss hat.

Ja, die Animation ist eine Solche.

Nun, ich konnte das Problem im Code Behind, wie folgt, lösen.
1
        RingControl.UserControl1 rc;
2
3
        private void popu_MouseEnter(object sender, MouseEventArgs e)
4
        {
5
            rc = new RingControl.UserControl1();
6
            popu.Child = rc;
7
            popu.IsOpen = true;
8
        }

Mit jedem "MouseEnter"-Event wird das UserControl1 neu instanziiert.
Am XAML-Code habe ich nichts geändert.
Im Anhang ist das UserControl.

Was ist mit dem PopUpAnimation-Attribut gemeint?

Danke im Voraus

von Ecki (Gast)


Lesenswert?

Das PopUpAnimation-Attribut ("Fade") ist am Popup angegeben. Der 
Default-Wert ist "None". Aber daran liegt es nicht.

Das "FrameworkElement.Loaded"-Event wird mit jedem Aufpoppen erneut 
gefeuert und damit das Storyboard neu gestartet. Der Ausgangswert ist 
dann jeweils nicht mehr 0 sondern irgendein Wert aus der letzten 
Ausführung - z.B. -100. Wird das Storyboard erneut gestartet, muss er 
für die selbe Zeit nur noch wenig an den Werten ändern, um auf -359 zu 
kommen. Daher wird es langsamer.

Jetzt ist die Frage, was du machen möchtest. Soll die Animation mit 
jedem Aufpoppen neu gestartet werden, muss man sie nur beim Ausblenden 
("Unloaded"-Event) stoppen:
1
    <UserControl.Triggers>
2
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
3
            <BeginStoryboard x:Name="beginStoryboard" Storyboard="{StaticResource Storyboard1}"/>
4
        </EventTrigger>
5
        <EventTrigger RoutedEvent="FrameworkElement.Unloaded">
6
            <StopStoryboard BeginStoryboardName="beginStoryboard" />
7
        </EventTrigger>
8
    </UserControl.Triggers>

Gruss

von MikroMakro (Gast)


Lesenswert?

>Das PopUpAnimation-Attribut ("Fade") ist am Popup angegeben. Der
>Default-Wert ist "None". Aber daran liegt es nicht.

Ah!Ok, dass war damit gemeint.

>Soll die Animation mit
>jedem Aufpoppen neu gestartet werden, muss man sie nur beim Ausblenden
>("Unloaded"-Event) stoppen:

Stimmt, dass macht Sinn. Habe es so umgesetzt.
Nun läuft es jedoch beim 1ten Aufpoppen langsamer.
Bei allen nachfolgenden "Aufpopper" läuft es in der gewünschten 
Geschwindigkeit.

von Ecki (Gast)


Lesenswert?

Hm, das hast du aber wieder rausgenommen, ja?
1
            rc = new RingControl.UserControl1();
2
            popu.Child = rc;

Ein kleiner abgewandelter Test bei mir mit einem Tooltip (leitet von 
Popup ab) funktioniert wie erwartet.

Window:
1
<Window x:Class="WpfApplication34.MainWindow"
2
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4
        Title="MainWindow" Height="350" Width="525"
5
        xmlns:local="clr-namespace:WpfApplication34">
6
    <Grid>
7
        
8
        <Label Content="Zack" Background="Green" HorizontalAlignment="Center" VerticalAlignment="Center">
9
            <Label.ToolTip>
10
                <ToolTip>
11
                    <local:UserControl1 Background="Blue" Width="100" Height="100" />
12
                </ToolTip>
13
            </Label.ToolTip>
14
        </Label>
15
        
16
    </Grid>
17
</Window>

UserControl:
1
<UserControl x:Class="WpfApplication34.UserControl1"
2
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
4
    <UserControl.Resources>
5
        
6
        <Storyboard x:Key="Storyboard1">
7
            <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="trans" Storyboard.TargetProperty="Angle" RepeatBehavior="Forever">
8
                <SplineDoubleKeyFrame KeyTime="00:00:7" Value="359"/>
9
            </DoubleAnimationUsingKeyFrames>
10
        </Storyboard>
11
    </UserControl.Resources>
12
    
13
    <UserControl.Triggers>
14
        <EventTrigger RoutedEvent="FrameworkElement.Loaded">
15
            <BeginStoryboard x:Name="beginStoryboard" Storyboard="{StaticResource Storyboard1}"/>
16
        </EventTrigger>
17
        <EventTrigger RoutedEvent="FrameworkElement.Unloaded">
18
            <StopStoryboard BeginStoryboardName="beginStoryboard" />
19
        </EventTrigger>
20
    </UserControl.Triggers>
21
    
22
    <Grid>
23
        <Rectangle x:Name="rect" Width="30" Height="30" Fill="Red">
24
            <Rectangle.RenderTransform>
25
                <RotateTransform x:Name="trans" CenterX="15" CenterY="15" />
26
            </Rectangle.RenderTransform>
27
        </Rectangle>
28
    </Grid>
29
</UserControl>

Weiterer Code-Behind ist nicht notwendig.

Viel Erfolg noch!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.