Skip to content

Commit 3583df6

Browse files
[release/9.0] Modified Expander animation mechanism in Fluent to avoid Argument Null Exception (#10135)
* Modified Expander animation mechanism in Fluent to avoid NRE exception * Addressing PR review comments --------- Co-authored-by: dipeshmsft <[email protected]>
1 parent dd88570 commit 3583df6

File tree

5 files changed

+157
-97
lines changed

5 files changed

+157
-97
lines changed

src/Microsoft.DotNet.Wpf/src/Themes/PresentationFramework.Fluent/Controls/AnimationFactorToValueConverter.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public object Convert(object[] values, Type targetType, object parameter, Cultur
1717
return 0.0;
1818
}
1919

20-
if (values[1] is not double factor)
20+
if (values[1] is not double factor || factor == double.NaN)
2121
{
2222
return 0.0;
2323
}

src/Microsoft.DotNet.Wpf/src/Themes/PresentationFramework.Fluent/Styles/Expander.xaml

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,8 @@
316316
</Border>
317317

318318
<Grid x:Name="ContentPresenterGrid" DockPanel.Dock="Bottom" ClipToBounds="True">
319+
<!-- Dummy border to store Animation factor for expander -->
320+
<Border x:Name="AnimationFactorBorder" Width="0" Visibility="Collapsed" />
319321
<Border x:Name="ContentPresenterBorder"
320322
Background="{DynamicResource ExpanderContentBackground}"
321323
BorderBrush="{TemplateBinding BorderBrush}"
@@ -327,23 +329,36 @@
327329
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
328330
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
329331
Content="{TemplateBinding Content}" />
330-
<Border.Tag>
331-
<system:Double>0.0</system:Double>
332-
</Border.Tag>
333332
<Border.Resources>
334-
<TranslateTransform x:Key="HeightAnimation">
333+
<TranslateTransform x:Key="HeightAnimationNegative">
335334
<TranslateTransform.Y>
336335
<MultiBinding Converter="{StaticResource AnimationFactorToValueConverter}" ConverterParameter="negative">
337336
<Binding ElementName="ContentPresenterBorder" Path="ActualHeight" />
338-
<Binding ElementName="ContentPresenterBorder" Path="Tag" />
337+
<Binding ElementName="AnimationFactorBorder" Path="Width" />
339338
</MultiBinding>
340339
</TranslateTransform.Y>
341340
</TranslateTransform>
342-
<TranslateTransform x:Key="WidthAnimation">
341+
<TranslateTransform x:Key="WidthAnimationNegative">
343342
<TranslateTransform.X>
344343
<MultiBinding Converter="{StaticResource AnimationFactorToValueConverter}" ConverterParameter="negative">
345344
<Binding ElementName="ContentPresenterBorder" Path="ActualWidth" />
346-
<Binding ElementName="ContentPresenterBorder" Path="Tag" />
345+
<Binding ElementName="AnimationFactorBorder" Path="Width" />
346+
</MultiBinding>
347+
</TranslateTransform.X>
348+
</TranslateTransform>
349+
<TranslateTransform x:Key="HeightAnimationPositive">
350+
<TranslateTransform.Y>
351+
<MultiBinding Converter="{StaticResource AnimationFactorToValueConverter}" ConverterParameter="positive">
352+
<Binding ElementName="ContentPresenterBorder" Path="ActualHeight" />
353+
<Binding ElementName="AnimationFactorBorder" Path="Width" />
354+
</MultiBinding>
355+
</TranslateTransform.Y>
356+
</TranslateTransform>
357+
<TranslateTransform x:Key="WidthAnimationPositive">
358+
<TranslateTransform.X>
359+
<MultiBinding Converter="{StaticResource AnimationFactorToValueConverter}" ConverterParameter="positive">
360+
<Binding ElementName="ContentPresenterBorder" Path="ActualWidth" />
361+
<Binding ElementName="AnimationFactorBorder" Path="Width" />
347362
</MultiBinding>
348363
</TranslateTransform.X>
349364
</TranslateTransform>
@@ -366,7 +381,7 @@
366381
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="(Border.Visibility)">
367382
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
368383
</ObjectAnimationUsingKeyFrames>
369-
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="Tag">
384+
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="AnimationFactorBorder" Storyboard.TargetProperty="Width">
370385
<DiscreteDoubleKeyFrame KeyTime="0" Value="1.0" />
371386
<SplineDoubleKeyFrame
372387
KeySpline="0.0, 0.0, 0.0, 1.0"
@@ -381,9 +396,9 @@
381396
<Storyboard>
382397
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="(Border.Visibility)">
383398
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
384-
<DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="{x:Static Visibility.Collapsed}" />
399+
<DiscreteObjectKeyFrame KeyTime="0:0:5" Value="{x:Static Visibility.Collapsed}" />
385400
</ObjectAnimationUsingKeyFrames>
386-
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="Tag">
401+
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="AnimationFactorBorder" Storyboard.TargetProperty="Width">
387402
<DiscreteDoubleKeyFrame KeyTime="0" Value="0.0" />
388403
<SplineDoubleKeyFrame
389404
KeySpline="1.0, 1.0, 0.0, 1.0"
@@ -411,8 +426,8 @@
411426
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="(Border.Visibility)">
412427
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
413428
</ObjectAnimationUsingKeyFrames>
414-
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="Tag">
415-
<DiscreteDoubleKeyFrame KeyTime="0" Value="-1.0" />
429+
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="AnimationFactorBorder" Storyboard.TargetProperty="Width">
430+
<DiscreteDoubleKeyFrame KeyTime="0" Value="1.0" />
416431
<SplineDoubleKeyFrame
417432
KeySpline="0.0, 0.0, 0.0, 1.0"
418433
KeyTime="0:0:0.333"
@@ -428,12 +443,12 @@
428443
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
429444
<DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="{x:Static Visibility.Collapsed}" />
430445
</ObjectAnimationUsingKeyFrames>
431-
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="Tag">
446+
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="AnimationFactorBorder" Storyboard.TargetProperty="Width">
432447
<DiscreteDoubleKeyFrame KeyTime="0" Value="0.0" />
433448
<SplineDoubleKeyFrame
434449
KeySpline="1.0, 1.0, 0.0, 1.0"
435450
KeyTime="0:0:0.333"
436-
Value="-1.0" />
451+
Value="1.0" />
437452
</DoubleAnimationUsingKeyFrames>
438453
</Storyboard>
439454
</BeginStoryboard>
@@ -456,8 +471,8 @@
456471
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="(Border.Visibility)">
457472
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
458473
</ObjectAnimationUsingKeyFrames>
459-
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="Tag">
460-
<DiscreteDoubleKeyFrame KeyTime="0" Value="-1.0" />
474+
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="AnimationFactorBorder" Storyboard.TargetProperty="Width">
475+
<DiscreteDoubleKeyFrame KeyTime="0" Value="1.0" />
461476
<SplineDoubleKeyFrame
462477
KeySpline="0.0, 0.0, 0.0, 1.0"
463478
KeyTime="0:0:0.333"
@@ -473,12 +488,12 @@
473488
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
474489
<DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="{x:Static Visibility.Collapsed}" />
475490
</ObjectAnimationUsingKeyFrames>
476-
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="Tag">
491+
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="AnimationFactorBorder" Storyboard.TargetProperty="Width">
477492
<DiscreteDoubleKeyFrame KeyTime="0" Value="0.0" />
478493
<SplineDoubleKeyFrame
479494
KeySpline="1.0, 1.0, 0.0, 1.0"
480495
KeyTime="0:0:0.333"
481-
Value="-1.0" />
496+
Value="1.0" />
482497
</DoubleAnimationUsingKeyFrames>
483498
</Storyboard>
484499
</BeginStoryboard>
@@ -501,7 +516,7 @@
501516
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="(Border.Visibility)">
502517
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
503518
</ObjectAnimationUsingKeyFrames>
504-
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="Tag">
519+
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="AnimationFactorBorder" Storyboard.TargetProperty="Width">
505520
<DiscreteDoubleKeyFrame KeyTime="0" Value="1.0" />
506521
<SplineDoubleKeyFrame
507522
KeySpline="0.0, 0.0, 0.0, 1.0"
@@ -518,7 +533,7 @@
518533
<DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
519534
<DiscreteObjectKeyFrame KeyTime="0:0:0.2" Value="{x:Static Visibility.Collapsed}" />
520535
</ObjectAnimationUsingKeyFrames>
521-
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenterBorder" Storyboard.TargetProperty="Tag">
536+
<DoubleAnimationUsingKeyFrames Storyboard.TargetName="AnimationFactorBorder" Storyboard.TargetProperty="Width">
522537
<DiscreteDoubleKeyFrame KeyTime="0" Value="0.0" />
523538
<SplineDoubleKeyFrame
524539
KeySpline="1.0, 1.0, 0.0, 1.0"
@@ -542,7 +557,7 @@
542557
Value="{StaticResource DefaultExpanderToggleButtonRightStyle}"
543558
TargetName="HeaderSite"/>
544559
<Setter Property="RenderTransform"
545-
Value="{DynamicResource WidthAnimation}"
560+
Value="{DynamicResource WidthAnimationNegative}"
546561
TargetName="ContentPresenterBorder" />
547562
</Trigger>
548563

@@ -558,14 +573,14 @@
558573
Value="{StaticResource DefaultExpanderToggleButtonUpStyle}"
559574
TargetName="HeaderSite"/>
560575
<Setter Property="RenderTransform"
561-
Value="{DynamicResource HeightAnimation}"
576+
Value="{DynamicResource HeightAnimationPositive}"
562577
TargetName="ContentPresenterBorder" />
563578
</Trigger>
564579

565580
<Trigger Property="ExpandDirection"
566581
Value="Down">
567582
<Setter Property="RenderTransform"
568-
Value="{DynamicResource HeightAnimation}"
583+
Value="{DynamicResource HeightAnimationNegative}"
569584
TargetName="ContentPresenterBorder" />
570585
</Trigger>
571586

@@ -581,7 +596,7 @@
581596
Value="{StaticResource DefaultExpanderToggleButtonLeftStyle}"
582597
TargetName="HeaderSite"/>
583598
<Setter Property="RenderTransform"
584-
Value="{DynamicResource WidthAnimation}"
599+
Value="{DynamicResource WidthAnimationPositive}"
585600
TargetName="ContentPresenterBorder" />
586601
</Trigger>
587602

0 commit comments

Comments
 (0)