diff --git a/ReadMe.md b/ReadMe.md
index e83cf795b..2c0ab01a7 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -28,7 +28,7 @@ Otherwise, you can clone the repo, open the `components` directory, navigate wit
- [DataTable](https://github.com/CommunityToolkit/Labs-Windows/blob/main/components/DataTable/samples/DataTable.md)
- [Extensions.DependencyInjection](https://github.com/CommunityToolkit/Labs-Windows/tree/main/components/Extensions.DependencyInjection)
- [MarkdownTextBlock](https://github.com/CommunityToolkit/Labs-Windows/blob/main/components/MarkdownTextBlock/samples/MarkdownTextBlock.md)
-- [MarqueeText](https://github.com/CommunityToolkit/Labs-Windows/blob/main/components/MarqueeText/samples/MarqueeText.md)
+- [Marquee](https://github.com/CommunityToolkit/Labs-Windows/blob/main/components/Marquee/samples/Marquee.md)
- [Notifications](https://github.com/CommunityToolkit/Labs-Windows/tree/main/components/Notifications)
- [Ribbon](https://github.com/CommunityToolkit/Labs-Windows/blob/main/components/Ribbon/samples/Ribbon.md)
- [RivePlayer](https://github.com/CommunityToolkit/Labs-Windows/blob/main/components/RivePlayer/samples/RivePlayer.md)
diff --git a/components/MarqueeText/OpenSolution.bat b/components/Marquee/OpenSolution.bat
similarity index 100%
rename from components/MarqueeText/OpenSolution.bat
rename to components/Marquee/OpenSolution.bat
diff --git a/components/MarqueeText/samples/Assets/MarqueeText.png b/components/Marquee/samples/Assets/Marquee.png
similarity index 100%
rename from components/MarqueeText/samples/Assets/MarqueeText.png
rename to components/Marquee/samples/Assets/Marquee.png
diff --git a/components/MarqueeText/samples/Dependencies.props b/components/Marquee/samples/Dependencies.props
similarity index 100%
rename from components/MarqueeText/samples/Dependencies.props
rename to components/Marquee/samples/Dependencies.props
diff --git a/components/Marquee/samples/Marquee.md b/components/Marquee/samples/Marquee.md
new file mode 100644
index 000000000..69f8e9a96
--- /dev/null
+++ b/components/Marquee/samples/Marquee.md
@@ -0,0 +1,52 @@
+---
+title: Marquee
+author: Avid29
+description: A control for scrolling content in a marquee fashion.
+keywords: Marquee, Control
+dev_langs:
+ - csharp
+category: Controls
+subcategory: Layout
+experimental: true
+discussion-id: 231
+issue-id: 426
+icon: Assets/Marquee.png
+---
+
+The Marquee control allows text or other content to scroll in a marquee fashion. The control is heavily templated and many changes can be made by modifying the style. The control can also be adjusted using the Speed, Behavior, RepeatBehavior, and Direction properties.
+
+## Speed
+
+The speed property determines how quickly the content moves in pixels per second. The speed can be adjusted mid-animation and handled continously.
+
+## Behavior
+
+The Marquee control has 3 behaviors
+
+### Ticker
+
+Ticker mode starts with all content off the screen then scrolls the content across across the screen. When the animation finishes in the mode no content will be on screen.
+
+### Looping
+
+Looping mode will begin with the start of the content fully in frame then scroll towards the end. When the end is reached it will loop back to the start of the content. Nothing will happen if the content fits in frame.
+
+### Bouncing
+
+Looping mode will begin with the start of the content fully in frame then scroll towards the end. When the end is reached it will bounce and scroll backwards to the start of the content. Nothing will happen if the content fits in frame.
+
+## RepeatBehavior
+
+The repeat behavior determines how many times the marquee will loop before the animation finishes. It can be a number of iteration, a duration, or forever.
+
+## Direction
+
+The default direction is left, meaning the content will move leftwards, but this can be changed to right, up, or down. Direction changed between left and right or up and down are handled continously, meaning that the animation will resume from its current position if changed between these directions.
+
+> [!Sample MarqueeTextSample]
+
+## Non-Text Content
+
+It is possible to use non-text content in the Marquee control. However templating must be used because the control will need to be duplicated for the looping animation.
+
+> [!Sample MarqueeSample]
diff --git a/components/Marquee/samples/MarqueeSample.xaml b/components/Marquee/samples/MarqueeSample.xaml
new file mode 100644
index 000000000..5a37d7777
--- /dev/null
+++ b/components/Marquee/samples/MarqueeSample.xaml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/components/Marquee/samples/MarqueeSample.xaml.cs b/components/Marquee/samples/MarqueeSample.xaml.cs
new file mode 100644
index 000000000..1fc320d95
--- /dev/null
+++ b/components/Marquee/samples/MarqueeSample.xaml.cs
@@ -0,0 +1,73 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using CommunityToolkit.WinUI.Controls;
+using Windows.UI;
+
+namespace MarqueeExperiment.Samples;
+
+[ToolkitSample(id: nameof(MarqueeSample), "Marquee", description: "A control for scrolling content in a marquee fashion.")]
+[ToolkitSampleNumericOption("MQSpeed", initial: 96, min: 48, max: 196, step: 1, Title = "Speed")]
+[ToolkitSampleMultiChoiceOption("MQDirection", "Left", "Right", "Up", "Down", Title = "Marquee Direction")]
+//[ToolkitSampleMultiChoiceOption("MarqueeRepeat", "Repeat", "Forever", "1x", "2x")]
+#if !HAS_UNO
+[ToolkitSampleMultiChoiceOption("MQBehavior", "Ticker", "Looping", "Bouncing", Title = "Marquee Behavior")]
+#else
+[ToolkitSampleMultiChoiceOption("MQBehavior", "Ticker", "Looping", Title = "Marquee Behavior")]
+#endif
+public sealed partial class MarqueeSample : Page
+{
+ public MarqueeSample()
+ {
+ this.InitializeComponent();
+
+ for (int i = 0; i < 15; i++)
+ {
+ AddItem_Click(this, null);
+ }
+ }
+
+ private MarqueeBehavior ConvertStringToMarqueeBehavior(string str) => str switch
+ {
+ "Looping" => MarqueeBehavior.Looping,
+ "Ticker" => MarqueeBehavior.Ticker,
+#if !HAS_UNO
+ "Bouncing" => MarqueeBehavior.Bouncing,
+#endif
+ _ => throw new NotImplementedException(),
+ };
+
+ public MarqueeSampleItems Data = new();
+
+ private MarqueeDirection ConvertStringToMarqueeDirection(string str) => str switch
+ {
+ "Left" => MarqueeDirection.Left,
+ "Up" => MarqueeDirection.Up,
+ "Right" => MarqueeDirection.Right,
+ "Down" => MarqueeDirection.Down,
+ _ => throw new NotImplementedException(),
+ };
+
+ private void AddItem_Click(object sender, RoutedEventArgs? e)
+ {
+ var rand = new Random();
+ Data.Items.Add(new MarqueeSampleItem()
+ {
+ Name = $"Item {Data.Items.Count + 1}",
+ Brush = new SolidColorBrush(Color.FromArgb(255, (byte)rand.Next(256), (byte)rand.Next(256), (byte)rand.Next(256))),
+ });
+ }
+}
+
+public class MarqueeSampleItems
+{
+ public ObservableCollection Items { get; } = new();
+}
+
+public record MarqueeSampleItem
+{
+ public string? Name { get; set; }
+
+ public Brush? Brush { get; set; }
+}
diff --git a/components/MarqueeText/samples/MarqueeText.Samples.csproj b/components/Marquee/samples/MarqueeText.Samples.csproj
similarity index 64%
rename from components/MarqueeText/samples/MarqueeText.Samples.csproj
rename to components/Marquee/samples/MarqueeText.Samples.csproj
index fc4e7acb7..05b200ace 100644
--- a/components/MarqueeText/samples/MarqueeText.Samples.csproj
+++ b/components/Marquee/samples/MarqueeText.Samples.csproj
@@ -1,25 +1,20 @@
- MarqueeText
+ Marquee
+
+ MarqueeTextSample.xaml
-
-
-
-
-
-
-
-
-
- PreserveNewest
-
+
+ MarqueeSample.xaml
+
+
diff --git a/components/Marquee/samples/MarqueeTextSample.xaml b/components/Marquee/samples/MarqueeTextSample.xaml
new file mode 100644
index 000000000..3912726e9
--- /dev/null
+++ b/components/Marquee/samples/MarqueeTextSample.xaml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
diff --git a/components/MarqueeText/samples/MarqueeTextSample.xaml.cs b/components/Marquee/samples/MarqueeTextSample.xaml.cs
similarity index 82%
rename from components/MarqueeText/samples/MarqueeTextSample.xaml.cs
rename to components/Marquee/samples/MarqueeTextSample.xaml.cs
index a40063b0b..d42d73b9c 100644
--- a/components/MarqueeText/samples/MarqueeTextSample.xaml.cs
+++ b/components/Marquee/samples/MarqueeTextSample.xaml.cs
@@ -4,10 +4,12 @@
using CommunityToolkit.WinUI.Controls;
-namespace MarqueeTextExperiment.Samples;
-[ToolkitSample(id: nameof(MarqueeTextSample), "MarqueeText", description: "A control for scrolling text in a marquee fashion.")]
+namespace MarqueeExperiment.Samples;
+
+[ToolkitSample(id: nameof(MarqueeTextSample), "Marquee", description: "A control for scrolling content in a marquee fashion.")]
[ToolkitSampleNumericOption("MQSpeed", initial: 96, min: 48, max: 196, step: 1, Title = "Speed")]
[ToolkitSampleMultiChoiceOption("MQDirection", "Left", "Right", "Up", "Down", Title = "Marquee Direction")]
+[ToolkitSampleTextOption("MQText", "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.")]
//[ToolkitSampleMultiChoiceOption("MarqueeRepeat", "Repeat", "Forever", "1x", "2x")]
#if !HAS_UNO
[ToolkitSampleMultiChoiceOption("MQBehavior", "Ticker", "Looping", "Bouncing", Title = "Marquee Behavior")]
diff --git a/components/MarqueeText/src/CommunityToolkit.WinUI.Controls.MarqueeText.csproj b/components/Marquee/src/CommunityToolkit.WinUI.Controls.Marquee.csproj
similarity index 68%
rename from components/MarqueeText/src/CommunityToolkit.WinUI.Controls.MarqueeText.csproj
rename to components/Marquee/src/CommunityToolkit.WinUI.Controls.Marquee.csproj
index 5417f418a..fe03af136 100644
--- a/components/MarqueeText/src/CommunityToolkit.WinUI.Controls.MarqueeText.csproj
+++ b/components/Marquee/src/CommunityToolkit.WinUI.Controls.Marquee.csproj
@@ -1,17 +1,13 @@
- MarqueeText
- This package contains MarqueeText.
+ Marquee
+ This package contains Marquee.
- CommunityToolkit.WinUI.Controls.MarqueeTextRns
+ CommunityToolkit.WinUI.Controls.MarqueeRns
-
-
-
-
diff --git a/components/MarqueeText/src/Dependencies.props b/components/Marquee/src/Dependencies.props
similarity index 100%
rename from components/MarqueeText/src/Dependencies.props
rename to components/Marquee/src/Dependencies.props
diff --git a/components/MarqueeText/src/MarqueeText.Events.cs b/components/Marquee/src/Marquee.Events.cs
similarity index 59%
rename from components/MarqueeText/src/MarqueeText.Events.cs
rename to components/Marquee/src/Marquee.Events.cs
index ce140fcff..53502d7e2 100644
--- a/components/MarqueeText/src/MarqueeText.Events.cs
+++ b/components/Marquee/src/Marquee.Events.cs
@@ -7,7 +7,7 @@ namespace CommunityToolkit.WinUI.Controls;
///
/// A Control that displays Text in a Marquee style.
///
-public partial class MarqueeText
+public partial class Marquee
{
///
/// Event raised when the Marquee begins scrolling.
@@ -23,10 +23,30 @@ public partial class MarqueeText
/// Event raised when the Marquee completes scrolling.
///
public event EventHandler? MarqueeCompleted;
+
+ private void Marquee_Loaded(object sender, RoutedEventArgs e)
+ {
+ // While loaded, detach the loaded event and attach the unloaded event
+ this.Loaded -= this.Marquee_Loaded;
+ this.Unloaded += Marquee_Unloaded;
+
+ // Attach other events
+ if (_marqueeContainer is not null)
+ {
+ _marqueeContainer.SizeChanged += Container_SizeChanged;
+ }
- private void MarqueeText_Unloaded(object sender, RoutedEventArgs e)
+ if (_marqueeStoryboard is not null)
+ {
+ _marqueeStoryboard.Completed += StoryBoard_Completed;
+ }
+ }
+
+ private void Marquee_Unloaded(object sender, RoutedEventArgs e)
{
- this.Unloaded -= MarqueeText_Unloaded;
+ // Restore the loaded event and detach the unloaded event
+ this.Loaded += Marquee_Loaded;
+ this.Unloaded -= Marquee_Unloaded;
if (_marqueeContainer is not null)
{
@@ -56,6 +76,18 @@ private void Container_SizeChanged(object sender, SizeChangedEventArgs e)
StartMarquee();
}
+ private void Segment_SizeChanged(object sender, SizeChangedEventArgs e)
+ {
+ if (_segment1 is null)
+ {
+ return;
+ }
+
+ // If the segment size changes, we need to update the storyboard,
+ // and seek to the correct position to maintain a smooth animation.
+ UpdateAnimation(true);
+ }
+
private void StoryBoard_Completed(object? sender, object e)
{
StopMarquee(true);
diff --git a/components/MarqueeText/src/MarqueeText.Properties.cs b/components/Marquee/src/Marquee.Properties.cs
similarity index 69%
rename from components/MarqueeText/src/MarqueeText.Properties.cs
rename to components/Marquee/src/Marquee.Properties.cs
index 0b0e35ca9..000817633 100644
--- a/components/MarqueeText/src/MarqueeText.Properties.cs
+++ b/components/Marquee/src/Marquee.Properties.cs
@@ -9,36 +9,19 @@ namespace CommunityToolkit.WinUI.Controls;
///
/// A Control that displays Text in a Marquee style.
///
-public partial class MarqueeText
+public partial class Marquee
{
- private static readonly DependencyProperty TextProperty =
- DependencyProperty.Register(nameof(Text), typeof(string), typeof(MarqueeText), new PropertyMetadata(null, PropertyChanged));
-
private static readonly DependencyProperty SpeedProperty =
- DependencyProperty.Register(nameof(Speed), typeof(double), typeof(MarqueeText), new PropertyMetadata(32d, PropertyChanged));
+ DependencyProperty.Register(nameof(Speed), typeof(double), typeof(Marquee), new PropertyMetadata(32d, PropertyChanged));
private static readonly DependencyProperty RepeatBehaviorProperty =
- DependencyProperty.Register(nameof(RepeatBehavior), typeof(RepeatBehavior), typeof(MarqueeText), new PropertyMetadata(new RepeatBehavior(1), PropertyChanged));
+ DependencyProperty.Register(nameof(RepeatBehavior), typeof(RepeatBehavior), typeof(Marquee), new PropertyMetadata(new RepeatBehavior(1), PropertyChanged));
private static readonly DependencyProperty BehaviorProperty =
- DependencyProperty.Register(nameof(Behavior), typeof(MarqueeBehavior), typeof(MarqueeText), new PropertyMetadata(0, BehaviorPropertyChanged));
+ DependencyProperty.Register(nameof(Behavior), typeof(MarqueeBehavior), typeof(Marquee), new PropertyMetadata(0, BehaviorPropertyChanged));
private static readonly DependencyProperty DirectionProperty =
- DependencyProperty.Register(nameof(Direction), typeof(MarqueeDirection), typeof(MarqueeText), new PropertyMetadata(MarqueeDirection.Left, DirectionPropertyChanged));
-
- #if !HAS_UNO
- private static readonly DependencyProperty TextDecorationsProperty =
- DependencyProperty.Register(nameof(TextDecorations), typeof(TextDecorations), typeof(MarqueeText), new PropertyMetadata(TextDecorations.None));
- #endif
-
- ///
- /// Gets or sets the text being displayed in Marquee.
- ///
- public string Text
- {
- get => (string)GetValue(TextProperty);
- set => SetValue(TextProperty, value);
- }
+ DependencyProperty.Register(nameof(Direction), typeof(MarqueeDirection), typeof(Marquee), new PropertyMetadata(MarqueeDirection.Left, DirectionPropertyChanged));
///
/// Gets or sets the speed the text moves in the Marquee.
@@ -93,25 +76,9 @@ public MarqueeDirection Direction
private bool IsDirectionInverse => Direction is MarqueeDirection.Up or MarqueeDirection.Right;
- // Waiting on https://github.com/unoplatform/uno/issues/12929
- #if !HAS_UNO
- ///
- /// Gets or sets a value that indicates what decorations are applied to the text.
- ///
-#if WINUI3
- public Windows.UI.Text.TextDecorations TextDecorations
-#elif WINUI2
- public Windows.UI.Text.TextDecorations TextDecorations
-#endif
- {
- get => (TextDecorations)GetValue(TextDecorationsProperty);
- set => SetValue(TextDecorationsProperty, value);
- }
- #endif
-
private static void BehaviorPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
- if (d is not MarqueeText control)
+ if (d is not Marquee control)
{
return;
}
@@ -130,7 +97,7 @@ private static void BehaviorPropertyChanged(DependencyObject d, DependencyProper
private static void DirectionPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
- if (d is not MarqueeText control)
+ if (d is not Marquee control)
{
return;
}
@@ -156,7 +123,7 @@ private static void DirectionPropertyChanged(DependencyObject d, DependencyPrope
private static void PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
- if (d is not MarqueeText control)
+ if (d is not Marquee control)
{
return;
}
diff --git a/components/MarqueeText/src/MarqueeText.cs b/components/Marquee/src/Marquee.cs
similarity index 89%
rename from components/MarqueeText/src/MarqueeText.cs
rename to components/Marquee/src/Marquee.cs
index e467232e6..d29d2e04a 100644
--- a/components/MarqueeText/src/MarqueeText.cs
+++ b/components/Marquee/src/Marquee.cs
@@ -8,9 +8,8 @@ namespace CommunityToolkit.WinUI.Controls;
/// A Control that displays Text in a Marquee style.
///
[TemplatePart(Name = MarqueeContainerPartName, Type = typeof(Panel))]
-[TemplatePart(Name = Segment1PartName, Type = typeof(FrameworkTemplate))]
-[TemplatePart(Name = Segment2PartName, Type = typeof(FrameworkTemplate))]
-[TemplatePart(Name = Segment2PartName, Type = typeof(FrameworkTemplate))]
+[TemplatePart(Name = Segment1PartName, Type = typeof(ContentPresenter))]
+[TemplatePart(Name = Segment2PartName, Type = typeof(ContentPresenter))]
[TemplatePart(Name = MarqueeTransformPartName, Type = typeof(TranslateTransform))]
[TemplateVisualState(GroupName = DirectionVisualStateGroupName, Name = LeftwardsVisualStateName)]
[TemplateVisualState(GroupName = DirectionVisualStateGroupName, Name = RightwardsVisualStateName)]
@@ -19,13 +18,7 @@ namespace CommunityToolkit.WinUI.Controls;
[TemplateVisualState(GroupName = BehaviorVisualStateGroupName, Name = TickerVisualStateName)]
[TemplateVisualState(GroupName = BehaviorVisualStateGroupName, Name = LoopingVisualStateName)]
[TemplateVisualState(GroupName = BehaviorVisualStateGroupName, Name = BouncingVisualStateName)]
-[ContentProperty(Name = nameof(Text))]
-
-#if HAS_UNO
-// See: https://github.com/CommunityToolkit/Labs-Windows/pull/275#issuecomment-1331113635
-#pragma warning disable CA1001
-#endif
-public partial class MarqueeText : Control
+public partial class Marquee : ContentControl
{
private const string MarqueeContainerPartName = "MarqueeContainer";
private const string Segment1PartName = "Segment1";
@@ -47,19 +40,19 @@ public partial class MarqueeText : Control
private const string BouncingVisualStateName = "Bouncing";
private Panel? _marqueeContainer;
- private FrameworkElement? _segment1;
- private FrameworkElement? _segment2;
+ private ContentPresenter? _segment1;
+ private ContentPresenter? _segment2;
private TranslateTransform? _marqueeTransform;
private Storyboard? _marqueeStoryboard;
private bool _isActive;
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
- public MarqueeText()
+ public Marquee()
{
- DefaultStyleKey = typeof(MarqueeText);
+ DefaultStyleKey = typeof(Marquee);
}
///
@@ -69,16 +62,17 @@ protected override void OnApplyTemplate()
// Explicit casting throws early when parts are missing from the template
_marqueeContainer = (Panel)GetTemplateChild(MarqueeContainerPartName);
- _segment1 = (FrameworkElement)GetTemplateChild(Segment1PartName);
- _segment2 = (FrameworkElement)GetTemplateChild(Segment2PartName);
+ _segment1 = (ContentPresenter)GetTemplateChild(Segment1PartName);
+ _segment2 = (ContentPresenter)GetTemplateChild(Segment2PartName);
_marqueeTransform = (TranslateTransform)GetTemplateChild(MarqueeTransformPartName);
_marqueeContainer.SizeChanged += Container_SizeChanged;
+ _segment1.SizeChanged += Segment_SizeChanged;
// Swapping tabs in TabView caused errors where the control would unload and never reattach events.
- // Hotfix: Don't detach events. This should be fine because the GC will handle it.
- // However, more research is required.
- //Unloaded += MarqueeText_Unloaded;
+ // Hotfix: Track the loaded event. This should be fine because the GC will handle detaching the Loaded
+ // event on disposal. However, more research is required
+ Loaded += this.Marquee_Loaded;
VisualStateManager.GoToState(this, GetVisualStateName(Direction), false);
VisualStateManager.GoToState(this, GetVisualStateName(Behavior), false);
@@ -181,6 +175,7 @@ _segment1 is null ||
double containerSize;
double segmentSize;
double value;
+ DependencyProperty dp;
string targetProperty;
if (IsDirectionHorizontal)
@@ -190,6 +185,7 @@ _segment1 is null ||
containerSize = _marqueeContainer.ActualWidth;
segmentSize = _segment1.ActualWidth;
value = _marqueeTransform.X;
+ dp = TranslateTransform.XProperty;
targetProperty = "(TranslateTransform.X)";
}
else
@@ -199,6 +195,7 @@ _segment1 is null ||
containerSize = _marqueeContainer.ActualHeight;
segmentSize = _segment1.ActualHeight;
value = _marqueeTransform.Y;
+ dp = TranslateTransform.YProperty;
targetProperty = "(TranslateTransform.Y)";
}
@@ -268,6 +265,15 @@ _segment1 is null ||
double progress = Math.Abs(start - value) / distance;
_marqueeStoryboard.Seek(TimeSpan.FromTicks((long)(duration.Ticks * progress)));
}
+
+ // NOTE: Can this be optimized to remove or reduce the need for this callback?
+ // Invalidate the segment measures when the transform changes.
+ // This forces virtualized panels to re-measure the segments
+ _marqueeTransform.RegisterPropertyChangedCallback(dp, (sender, dp) =>
+ {
+ _segment1.InvalidateMeasure();
+ _segment2.InvalidateMeasure();
+ });
return true;
}
@@ -320,7 +326,3 @@ private Storyboard CreateMarqueeStoryboardAnimation(double start, double end, Ti
return marqueeStoryboard;
}
}
-
-#if HAS_UNO
-#pragma warning restore CA1001
-#endif
diff --git a/components/MarqueeText/src/MarqueeText.xaml b/components/Marquee/src/Marquee.xaml
similarity index 70%
rename from components/MarqueeText/src/MarqueeText.xaml
rename to components/Marquee/src/Marquee.xaml
index cef78815c..73f6ec52c 100644
--- a/components/MarqueeText/src/MarqueeText.xaml
+++ b/components/Marquee/src/Marquee.xaml
@@ -4,12 +4,12 @@
xmlns:controls="using:CommunityToolkit.WinUI.Controls"
xmlns:win="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
-