Skip to content

Commit 778b3d8

Browse files
authored
Switching to a new converter to avoid memory leaks (#1683)
Added unit tests for the converter. Enabled InternalsVisibleTo to support testing internal converters.
1 parent 8df86b4 commit 778b3d8

File tree

4 files changed

+94
-25
lines changed

4 files changed

+94
-25
lines changed
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
using System.Collections.Generic;
2+
using System.Globalization;
3+
using System.Windows;
4+
using System.Windows.Media;
5+
using MaterialDesignThemes.Wpf.Converters;
6+
using Xunit;
7+
8+
namespace MaterialDesignThemes.Wpf.Tests.Converters
9+
{
10+
public class FloatingHintTransformConverterTests
11+
{
12+
public static IEnumerable<object[]> InvalidParameters =>
13+
new[]
14+
{
15+
new object[] {null, null},
16+
new object[] {1.0, null},
17+
new object[] {null, new Point()},
18+
new object[] {DependencyProperty.UnsetValue, new Point()},
19+
new object[] {1.0, DependencyProperty.UnsetValue},
20+
};
21+
22+
[StaTheory]
23+
[MemberData(nameof(InvalidParameters))]
24+
public void WhenParametersAreNotSetItReturnsIdentity(object scale, object offset)
25+
{
26+
var converter = new FloatingHintTransformConverter();
27+
28+
var result = converter.Convert(new[] { scale, offset }, typeof(Transform), null, CultureInfo.CurrentUICulture);
29+
30+
Assert.Equal(Transform.Identity, result);
31+
}
32+
33+
[StaTheory]
34+
[InlineData(2.0, 3.0, 4.0)]
35+
[InlineData(1.5, 2.0, 3.0)]
36+
public void WhenParametersAreSpecifiedItReturnsScaleTransform(double scale, double x, double y)
37+
{
38+
var converter = new FloatingHintTransformConverter();
39+
40+
var result = (TranslateTransform)converter.Convert(new object[] { scale, new Point(x, y) }, typeof(Transform), null, CultureInfo.CurrentUICulture);
41+
42+
Assert.Equal(scale * x, result.X);
43+
Assert.Equal(scale * y, result.Y);
44+
}
45+
}
46+
47+
48+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using System.Globalization;
3+
using System.Windows;
4+
using System.Windows.Data;
5+
using System.Windows.Media;
6+
7+
namespace MaterialDesignThemes.Wpf.Converters
8+
{
9+
internal class FloatingHintTransformConverter : IMultiValueConverter
10+
{
11+
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
12+
{
13+
if (values?.Length == 2 &&
14+
values[0] is double scale &&
15+
values[1] is Point floatingOffset)
16+
{
17+
return new TranslateTransform
18+
{
19+
X = scale * floatingOffset.X,
20+
Y = scale * floatingOffset.Y
21+
};
22+
}
23+
return Transform.Identity;
24+
}
25+
26+
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
27+
{
28+
throw new NotImplementedException();
29+
}
30+
}
31+
}

MaterialDesignThemes.Wpf/Properties/AssemblyInfo.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Reflection;
1+
using System.Runtime.CompilerServices;
22
using System.Runtime.InteropServices;
33
using System.Windows;
44
using System.Windows.Markup;
@@ -22,11 +22,13 @@
2222
//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)]
2323

2424

25-
[assembly:ThemeInfo(
25+
[assembly: ThemeInfo(
2626
ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located
27-
//(used if a resource is not found in the page,
28-
// or application resource dictionaries)
27+
//(used if a resource is not found in the page,
28+
// or application resource dictionaries)
2929
ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located
30-
//(used if a resource is not found in the page,
31-
// app, or any theme specific resource dictionaries)
30+
//(used if a resource is not found in the page,
31+
// app, or any theme specific resource dictionaries)
3232
)]
33+
34+
[assembly: InternalsVisibleTo("MaterialDesignThemes.Wpf.Tests")]

MaterialDesignThemes.Wpf/Themes/MaterialDesignTheme.SmartHint.xaml

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<converters:BooleanToVisibilityConverter x:Key="BoolToVisConverter"/>
88
<converters:BooleanToVisibilityConverter x:Key="InverseBoolToVisConverter" TrueValue="Collapsed" FalseValue="Visible"/>
99
<converters:RangePositionConverter x:Key="RangePositionConverter"/>
10-
<converters:MathMultipleConverter x:Key="TranslateConverter" Operation="Multiply"/>
10+
<converters:FloatingHintTransformConverter x:Key="FloatingHintTransformConverter" />
1111
<system:Double x:Key="NoContentFloatingScale">1.0</system:Double>
1212
<SineEase x:Key="AnimationEasingFunction" EasingMode="EaseOut"/>
1313

@@ -126,7 +126,7 @@
126126
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
127127
Opacity="{TemplateBinding HintOpacity}"
128128
IsHitTestVisible="False"
129-
IsTabStop="False"
129+
IsTabStop="False"
130130
RenderTransformOrigin="0,1">
131131
<ContentControl.Tag>
132132
<system:Double>0.0</system:Double>
@@ -152,22 +152,10 @@
152152
</TransformGroup>
153153
</ContentControl.LayoutTransform>
154154
<ContentControl.RenderTransform>
155-
<TransformGroup>
156-
<TranslateTransform>
157-
<TranslateTransform.X>
158-
<MultiBinding Converter="{StaticResource TranslateConverter}">
159-
<Binding Path="Scale" ElementName="ScaleHost"/>
160-
<Binding Path="FloatingOffset.X" RelativeSource="{RelativeSource TemplatedParent}"/>
161-
</MultiBinding>
162-
</TranslateTransform.X>
163-
<TranslateTransform.Y>
164-
<MultiBinding Converter="{StaticResource TranslateConverter}">
165-
<Binding Path="Scale" ElementName="ScaleHost"/>
166-
<Binding Path="FloatingOffset.Y" RelativeSource="{RelativeSource TemplatedParent}"/>
167-
</MultiBinding>
168-
</TranslateTransform.Y>
169-
</TranslateTransform>
170-
</TransformGroup>
155+
<MultiBinding Converter="{StaticResource FloatingHintTransformConverter}">
156+
<Binding Path="Scale" ElementName="ScaleHost"/>
157+
<Binding Path="FloatingOffset" RelativeSource="{RelativeSource TemplatedParent}"/>
158+
</MultiBinding>
171159
</ContentControl.RenderTransform>
172160
</ContentControl>
173161
</Grid>
@@ -177,5 +165,5 @@
177165
</Trigger>
178166
</Style.Triggers>
179167
</Style>
180-
168+
181169
</ResourceDictionary>

0 commit comments

Comments
 (0)