[WPF] control met storyboard gooit exception bij verwijderen

Pagina: 1
Acties:

Onderwerpen


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Ik heb een TabControl met daarin wat TabItems. Sommige TabItems moeten sluitbaar zijn, dus ik heb met Expression Blend de standaard TabItem style geïmporteerd zodat ik er een sluitknopje in kon hangen. Alles goed en wel, tot ik wat fancier dingen wilde doen, namelijk de border om het knopje laten oplichten als je met de muis erboven hovert. Grofweg komt het in XAML hierop neer:

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<Border MouseDown="TabItem_Close" BorderBrush="#FF747474"> <!-- mijn sluitknopje -->
    <!-- meuk -->
    <Border.Triggers>
        <EventTrigger RoutedEvent="Mouse.MouseEnter">
            <BeginStoryboard Name="EnterStoryBoard">
                <Storyboard>
                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)">
                        <LinearColorKeyFrame KeyTime="0:0:0.25" Value="#FF747474"/>
                    </ColorAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="Mouse.MouseLeave">
            <BeginStoryboard Name="LeaveStoryBoard">
                <Storyboard>
                    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)">
                        <LinearColorKeyFrame KeyTime="0:0:0.25" Value="#00747474"/>
                    </ColorAnimationUsingKeyFrames>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Border.Triggers>
</Border>

Deze Border zit dus ergens in een ControlTemplate die wordt gezet als Template door de Style die wordt toegepast op een TabItem:
XML:
1
<TabItem Header="Bla" Style="{DynamicResource ClosableTabItem}"/>



In de TabItem_Close handler zoek ik simpelweg omhoog in de visual tree naar het TabItem wat erbij hoort, zodat ik die weg kan halen uit de lijst met Tabs.

Echter, zodra ik dat doe treedt er een exception op:
A first chance exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll

Additional information: 'BorderBrush' property does not point to a DependencyObject in path '(0).(1)'.
Hmm, ok, blijkbaar blijft het storyboard doorlopen nadat het control verwijderd is. Een zoektocht op internet bevestigt dit vermoeden. Ok, dan maar even de storyboards verwijderen bij een Unload, dus tussen de EventTriggers van de Border:
XML:
1
2
3
4
5
6
<EventTrigger RoutedEvent="FrameworkElement.Unloaded">
    <EventTrigger.Actions>
        <RemoveStoryboard BeginStoryboardName="EnterStoryBoard" />
        <RemoveStoryboard BeginStoryboardName="LeaveStoryBoard" />
    </EventTrigger.Actions>
</EventTrigger>

Maar dan is de exception ineens:
A first chance exception of type 'System.InvalidOperationException' occurred in PresentationFramework.dll

Additional information: 'EnterStoryBoard' name cannot be found in the name scope of 'System.Windows.Controls.Border'.
Het lijkt dus net alsof hij de context volledig kwijt is. Daarom werkt die animatie niet meer, maar ik kan die animaties ook niet meer stoppen 8)7.

Iemand enig idee hoe ik dit kan oplossen?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

Topicstarter
Blijkbaar krijg ik die exceptions dus alleen als ik die style op de TabItem zet middels als een DynamicResource. Als ik 'm als StaticResource zet dan werkt alles wel naar behoren. Wel fijn dat Expression Blend dus standaard voor DynamicResources kiest 8)7

[ Voor 3% gewijzigd door .oisyn op 08-09-2011 17:07 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.