Skip to content

Commit a8e23a4

Browse files
author
msftbot[bot]
authored
Normalize tilecontrol (#3612)
<!-- 🚨 Please Do Not skip any instructions and information mentioned below as they are all required and essential to evaluate and test the PR. By fulfilling all the required information you will be able to reduce the volume of questions and most likely help merge the PR faster 🚨 --> <!-- 📝 It is preferred if you keep the "☑️ Allow edits by maintainers" checked in the Pull Request Template as it increases collaboration with the Toolkit maintainers by permitting commits to your PR branch (only) created from your fork. This can let us quickly make fixes for minor typos or forgotten StyleCop issues during review without needing to wait on you doing extra work. Let us help you help us! 🎉 --> <!-- Add a brief overview here of the feature/bug & fix. --> Normalizes TileControl a little. ## PR Type What kind of change does this PR introduce? <!-- Please uncomment one or more that apply to this PR. --> <!-- - Bugfix --> <!-- - Feature --> <!-- - Code style update (formatting) --> - Refactoring (no functional changes, no api changes) <!-- - Build or CI related changes --> <!-- - Documentation content changes --> <!-- - Sample app changes --> <!-- - Other... Please describe: --> ## What is the current behavior? <!-- Please describe the current behavior that you are modifying, or link to a relevant issue. --> Everything was in one file for TileControl. ## What is the new behavior? <!-- Describe how was this issue resolved or changed? --> Enums and props have been separated to other files ## PR Checklist Please check if your PR fulfills the following requirements: - [ ] Tested code with current [supported SDKs](../readme.md#supported) - [ ] Pull Request has been submitted to the documentation repository [instructions](..\contributing.md#docs). Link: <!-- docs PR link --> - [ ] Sample in sample app has been added / updated (for bug fixes / features) - [ ] Icon has been created (if new sample) following the [Thumbnail Style Guide and templates](https://github.com/windows-toolkit/WindowsCommunityToolkit-design-assets) - [ ] Tests for the changes have been added (for bug fixes / features) (if applicable) - [ ] Header has been added to all new source files (run *build/UpdateHeaders.bat*) - [ ] Contains **NO** breaking changes <!-- If this PR contains a breaking change, please describe the impact and migration path for existing applications below. Please note that breaking changes are likely to be rejected within minor release cycles or held until major versions. --> ## Other information
2 parents 0975081 + b9619a3 commit a8e23a4

File tree

4 files changed

+326
-297
lines changed

4 files changed

+326
-297
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
namespace Microsoft.Toolkit.Uwp.UI.Controls
6+
{
7+
/// <summary>
8+
/// Image alignment
9+
/// </summary>
10+
public enum ImageAlignment
11+
{
12+
/// <summary>
13+
/// No alignment needed
14+
/// </summary>
15+
None,
16+
17+
/// <summary>
18+
/// Align to Left when the property ScrollOrientation is Horizontal
19+
/// </summary>
20+
Left,
21+
22+
/// <summary>
23+
/// Align to Right when the property ScrollOrientation is Horizontal
24+
/// </summary>
25+
Right,
26+
27+
/// <summary>
28+
/// Align to Top when the property ScrollOrientation is Vertical
29+
/// </summary>
30+
Top,
31+
32+
/// <summary>
33+
/// Align to Bottom when the property ScrollOrientation is Vertical
34+
/// </summary>
35+
Bottom
36+
}
37+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
namespace Microsoft.Toolkit.Uwp.UI.Controls
6+
{
7+
/// <summary>
8+
/// Orientation of the scroll
9+
/// </summary>
10+
public enum ScrollOrientation
11+
{
12+
/// <summary>
13+
/// Scroll only Horizontally (and optimize the number of image used)
14+
/// </summary>
15+
Horizontal,
16+
17+
/// <summary>
18+
/// Scroll only Vertically (and optimize the number of image used)
19+
/// </summary>
20+
Vertical,
21+
22+
/// <summary>
23+
/// Scroll both Horizontally and vertically
24+
/// </summary>
25+
Both
26+
}
27+
}
Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System;
6+
using Windows.UI.Xaml;
7+
using Windows.UI.Xaml.Controls;
8+
9+
namespace Microsoft.Toolkit.Uwp.UI.Controls
10+
{
11+
/// <summary>
12+
/// A ContentControl that show an image repeated many times.
13+
/// The control can be synchronized with a ScrollViewer and animated easily.
14+
/// </summary>
15+
public partial class TileControl : ContentControl
16+
{
17+
/// <summary>
18+
/// Identifies the <see cref="ScrollViewerContainer"/> property.
19+
/// </summary>
20+
public static readonly DependencyProperty ScrollViewerContainerProperty =
21+
DependencyProperty.Register(nameof(ScrollViewerContainer), typeof(FrameworkElement), typeof(TileControl), new PropertyMetadata(null, OnScrollViewerContainerChange));
22+
23+
/// <summary>
24+
/// Identifies the <see cref="ImageAlignment"/> property.
25+
/// </summary>
26+
public static readonly DependencyProperty ImageAlignmentProperty =
27+
DependencyProperty.Register(nameof(ImageAlignment), typeof(ImageAlignment), typeof(TileControl), new PropertyMetadata(ImageAlignment.None, OnAlignmentChange));
28+
29+
/// <summary>
30+
/// Identifies the <see cref="ImageSource"/> property.
31+
/// </summary>
32+
public static readonly DependencyProperty ImageSourceProperty =
33+
DependencyProperty.Register(nameof(ImageSource), typeof(Uri), typeof(TileControl), new PropertyMetadata(null, OnImageSourceChanged));
34+
35+
/// <summary>
36+
/// Identifies the <see cref="ScrollOrientation"/> property.
37+
/// </summary>
38+
public static readonly DependencyProperty ScrollOrientationProperty =
39+
DependencyProperty.Register(nameof(ScrollOrientation), typeof(ScrollOrientation), typeof(TileControl), new PropertyMetadata(ScrollOrientation.Both, OnOrientationChanged));
40+
41+
/// <summary>
42+
/// Identifies the <see cref="OffsetX"/> property.
43+
/// </summary>
44+
public static readonly DependencyProperty OffsetXProperty =
45+
DependencyProperty.Register(nameof(OffsetX), typeof(double), typeof(TileControl), new PropertyMetadata(0.0, OnOffsetChange));
46+
47+
/// <summary>
48+
/// Identifies the <see cref="OffsetY"/> property.
49+
/// </summary>
50+
public static readonly DependencyProperty OffsetYProperty =
51+
DependencyProperty.Register(nameof(OffsetY), typeof(double), typeof(TileControl), new PropertyMetadata(0.0, OnOffsetChange));
52+
53+
/// <summary>
54+
/// Identifies the <see cref="ParallaxSpeedRatio"/> property.
55+
/// </summary>
56+
public static readonly DependencyProperty ParallaxSpeedRatioProperty =
57+
DependencyProperty.Register(nameof(ParallaxSpeedRatio), typeof(double), typeof(TileControl), new PropertyMetadata(1.0, OnScrollSpeedRatioChange));
58+
59+
/// <summary>
60+
/// Identifies the <see cref="IsAnimated"/> property.
61+
/// </summary>
62+
public static readonly DependencyProperty IsAnimatedProperty =
63+
DependencyProperty.Register(nameof(IsAnimated), typeof(bool), typeof(TileControl), new PropertyMetadata(false, OnIsAnimatedChange));
64+
65+
/// <summary>
66+
/// Identifies the <see cref="AnimationStepX"/> property.
67+
/// </summary>
68+
public static readonly DependencyProperty AnimationStepXProperty =
69+
DependencyProperty.Register(nameof(AnimationStepX), typeof(double), typeof(TileControl), new PropertyMetadata(1.0));
70+
71+
/// <summary>
72+
/// Identifies the <see cref="AnimationStepY"/> property.
73+
/// </summary>
74+
public static readonly DependencyProperty AnimationStepYProperty =
75+
DependencyProperty.Register(nameof(AnimationStepY), typeof(double), typeof(TileControl), new PropertyMetadata(1.0));
76+
77+
/// <summary>
78+
/// Identifies the <see cref="AnimationDuration"/> property.
79+
/// </summary>
80+
public static readonly DependencyProperty AnimationDurationProperty =
81+
DependencyProperty.Register(nameof(AnimationDuration), typeof(double), typeof(TileControl), new PropertyMetadata(30.0, OnAnimationDuration));
82+
83+
/// <summary>
84+
/// Gets or sets a ScrollViewer or a frameworkElement containing a ScrollViewer.
85+
/// The tile control is synchronized with the offset of the scrollViewer
86+
/// </summary>
87+
public FrameworkElement ScrollViewerContainer
88+
{
89+
get { return (FrameworkElement)GetValue(ScrollViewerContainerProperty); }
90+
set { SetValue(ScrollViewerContainerProperty, value); }
91+
}
92+
93+
private static async void OnScrollViewerContainerChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
94+
{
95+
var control = d as TileControl;
96+
await control.InitializeScrollViewerContainer(e.OldValue as FrameworkElement, e.NewValue as FrameworkElement);
97+
}
98+
99+
/// <summary>
100+
/// Gets or sets the alignment of the tile when the <see cref="ScrollOrientation"/> is set to Vertical or Horizontal.
101+
/// Valid values are Left or Right for <see cref="ScrollOrientation"/> set to Horizontal and Top or Bottom for <see cref="ScrollOrientation"/> set to Vertical.
102+
/// </summary>
103+
public ImageAlignment ImageAlignment
104+
{
105+
get { return (ImageAlignment)GetValue(ImageAlignmentProperty); }
106+
set { SetValue(ImageAlignmentProperty, value); }
107+
}
108+
109+
private static async void OnAlignmentChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
110+
{
111+
var control = d as TileControl;
112+
await control.RefreshContainerTileLocked();
113+
}
114+
115+
/// <summary>
116+
/// Gets or sets the uri of the image to load
117+
/// </summary>
118+
public Uri ImageSource
119+
{
120+
get { return (Uri)GetValue(ImageSourceProperty); }
121+
set { SetValue(ImageSourceProperty, value); }
122+
}
123+
124+
private static async void OnImageSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
125+
{
126+
var control = d as TileControl;
127+
await control.LoadImageBrushAsync(e.NewValue as Uri);
128+
}
129+
130+
/// <summary>
131+
/// Gets or sets the scroll orientation of the tile.
132+
/// Less images are drawn when you choose the Horizontal or Vertical value.
133+
/// </summary>
134+
public ScrollOrientation ScrollOrientation
135+
{
136+
get { return (ScrollOrientation)GetValue(ScrollOrientationProperty); }
137+
set { SetValue(ScrollOrientationProperty, value); }
138+
}
139+
140+
private static async void OnOrientationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
141+
{
142+
var control = d as TileControl;
143+
await control.RefreshContainerTileLocked();
144+
await control.CreateModuloExpression(control._scrollViewer);
145+
}
146+
147+
/// <summary>
148+
/// Gets or sets an X offset of the image
149+
/// </summary>
150+
public double OffsetX
151+
{
152+
get { return (double)GetValue(OffsetXProperty); }
153+
set { SetValue(OffsetXProperty, value); }
154+
}
155+
156+
private static void OnOffsetChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
157+
{
158+
var c = d as TileControl;
159+
160+
c.RefreshMove();
161+
}
162+
163+
/// <summary>
164+
/// Gets or sets an Y offset of the image
165+
/// </summary>
166+
public double OffsetY
167+
{
168+
get { return (double)GetValue(OffsetYProperty); }
169+
set { SetValue(OffsetYProperty, value); }
170+
}
171+
172+
/// <summary>
173+
/// Gets or sets the speed ratio of the parallax effect with the <see cref="ScrollViewerContainer"/>
174+
/// </summary>
175+
public double ParallaxSpeedRatio
176+
{
177+
get { return (double)GetValue(ParallaxSpeedRatioProperty); }
178+
set { SetValue(ParallaxSpeedRatioProperty, value); }
179+
}
180+
181+
private static void OnScrollSpeedRatioChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
182+
{
183+
var c = d as TileControl;
184+
c.RefreshScrollSpeedRatio((double)e.NewValue);
185+
}
186+
187+
/// <summary>
188+
/// Gets or sets a value indicating whether the tile is animated or not
189+
/// </summary>
190+
public bool IsAnimated
191+
{
192+
get { return (bool)GetValue(IsAnimatedProperty); }
193+
set { SetValue(IsAnimatedProperty, value); }
194+
}
195+
196+
private static void OnIsAnimatedChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
197+
{
198+
var c = d as TileControl;
199+
200+
if ((bool)e.NewValue)
201+
{
202+
c._timerAnimation.Start();
203+
}
204+
else
205+
{
206+
c._timerAnimation.Stop();
207+
c._animationX = 0;
208+
c._animationY = 0;
209+
}
210+
}
211+
212+
/// <summary>
213+
/// Gets or sets the animation step of the OffsetX
214+
/// </summary>
215+
public double AnimationStepX
216+
{
217+
get { return (double)GetValue(AnimationStepXProperty); }
218+
set { SetValue(AnimationStepXProperty, value); }
219+
}
220+
221+
/// <summary>
222+
/// Gets or sets the animation step of the OffsetY
223+
/// </summary>
224+
public double AnimationStepY
225+
{
226+
get { return (double)GetValue(AnimationStepYProperty); }
227+
set { SetValue(AnimationStepYProperty, value); }
228+
}
229+
230+
/// <summary>
231+
/// Gets or sets a duration for the animation of the tile
232+
/// </summary>
233+
public double AnimationDuration
234+
{
235+
get { return (double)GetValue(AnimationDurationProperty); }
236+
set { SetValue(AnimationDurationProperty, value); }
237+
}
238+
239+
private static void OnAnimationDuration(DependencyObject d, DependencyPropertyChangedEventArgs e)
240+
{
241+
var c = d as TileControl;
242+
243+
c._timerAnimation.Interval = TimeSpan.FromMilliseconds(c.AnimationDuration);
244+
}
245+
}
246+
}

0 commit comments

Comments
 (0)