2
2
using ReactNative . Touch ;
3
3
using ReactNative . UIManager . Annotations ;
4
4
using System ;
5
+ using System . Collections . Generic ;
5
6
using Windows . UI . Xaml ;
6
7
using Windows . UI . Xaml . Automation ;
7
8
using Windows . UI . Xaml . Automation . Peers ;
@@ -23,6 +24,9 @@ public abstract class BaseViewManager<TFrameworkElement, TLayoutShadowNode> :
23
24
where TFrameworkElement : FrameworkElement
24
25
where TLayoutShadowNode : LayoutShadowNode
25
26
{
27
+ private readonly IDictionary < TFrameworkElement , Action < TFrameworkElement , Dimensions > > _transforms =
28
+ new Dictionary < TFrameworkElement , Action < TFrameworkElement , Dimensions > > ( ) ;
29
+
26
30
/// <summary>
27
31
/// Set's the <typeparamref name="TFrameworkElement"/> styling layout
28
32
/// properties, based on the <see cref="JObject"/> map.
@@ -32,14 +36,16 @@ public abstract class BaseViewManager<TFrameworkElement, TLayoutShadowNode> :
32
36
[ ReactProp ( "transform" ) ]
33
37
public void SetTransform ( TFrameworkElement view , JArray transforms )
34
38
{
35
- if ( transforms == null )
39
+ if ( transforms == null && _transforms . Remove ( view ) )
36
40
{
37
41
ResetProjectionMatrix ( view ) ;
38
42
ResetRenderTransform ( view ) ;
39
43
}
40
44
else
41
45
{
42
- SetProjectionMatrix ( view , transforms ) ;
46
+ _transforms [ view ] = ( v , d ) => SetProjectionMatrix ( v , d , transforms ) ;
47
+ var dimensions = GetDimensions ( view ) ;
48
+ SetProjectionMatrix ( view , dimensions , transforms ) ;
43
49
}
44
50
}
45
51
@@ -141,6 +147,23 @@ public override void OnDropViewInstance(ThemedReactContext reactContext, TFramew
141
147
{
142
148
view . PointerEntered -= OnPointerEntered ;
143
149
view . PointerExited -= OnPointerExited ;
150
+ _transforms . Remove ( view ) ;
151
+ }
152
+
153
+ /// <summary>
154
+ /// Sets the dimensions of the view.
155
+ /// </summary>
156
+ /// <param name="view">The view.</param>
157
+ /// <param name="dimensions">The dimensions.</param>
158
+ public override void SetDimensions ( TFrameworkElement view , Dimensions dimensions )
159
+ {
160
+ Action < TFrameworkElement , Dimensions > applyTransform ;
161
+ if ( _transforms . TryGetValue ( view , out applyTransform ) )
162
+ {
163
+ applyTransform ( view , dimensions ) ;
164
+ }
165
+
166
+ base . SetDimensions ( view , dimensions ) ;
144
167
}
145
168
146
169
/// <summary>
@@ -174,22 +197,22 @@ private void OnPointerExited(object sender, PointerRoutedEventArgs e)
174
197
TouchHandler . OnPointerExited ( view , e ) ;
175
198
}
176
199
177
- private static void SetProjectionMatrix ( TFrameworkElement view , JArray transforms )
200
+ private static void SetProjectionMatrix ( TFrameworkElement view , Dimensions dimensions , JArray transforms )
178
201
{
179
202
var transformMatrix = TransformHelper . ProcessTransform ( transforms ) ;
180
203
181
204
var translateMatrix = Matrix3D . Identity ;
182
205
var translateBackMatrix = Matrix3D . Identity ;
183
- if ( ! double . IsNaN ( view . Width ) )
206
+ if ( ! double . IsNaN ( dimensions . Width ) )
184
207
{
185
- translateMatrix . OffsetX = - view . Width / 2 ;
186
- translateBackMatrix . OffsetX = view . Width / 2 ;
208
+ translateMatrix . OffsetX = - dimensions . Width / 2 ;
209
+ translateBackMatrix . OffsetX = dimensions . Width / 2 ;
187
210
}
188
211
189
- if ( ! double . IsNaN ( view . Height ) )
212
+ if ( ! double . IsNaN ( dimensions . Height ) )
190
213
{
191
- translateMatrix . OffsetY = - view . Height / 2 ;
192
- translateBackMatrix . OffsetY = view . Height / 2 ;
214
+ translateMatrix . OffsetY = - dimensions . Height / 2 ;
215
+ translateBackMatrix . OffsetY = dimensions . Height / 2 ;
193
216
}
194
217
195
218
var projectionMatrix = translateMatrix * transformMatrix * translateBackMatrix ;
0 commit comments