2025-02-10 20:53:40 +08:00
|
|
|
|
using System;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Windows.Controls;
|
|
|
|
|
|
using System.Windows.Media.Animation;
|
|
|
|
|
|
|
|
|
|
|
|
namespace WPFluent.Controls;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 设置DataTempate
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <example>
|
2025-04-24 20:56:44 +08:00
|
|
|
|
/// <controls:RunningLine.LineTemplate><DataTemplate><AutoStackPanel Orientation = "Horizontal" >< Path
|
2025-02-10 20:53:40 +08:00
|
|
|
|
/// VerticalAlignment="Center" Data="M21.2575 9.44627V2.38044H22.8083V2.87294C23.9958 2.12794 26.1758 2.16461 27.285
|
|
|
|
|
|
/// 3.37878C27.8333 2.78461 28.5008 2.37877 29.4942 2.37877C30.8275 2.37877 32.365 3.13961 32.4617 4.69294C32.5025
|
|
|
|
|
|
/// 5.84378 32.4875 8.16711 32.5 9.44294H30.965C30.96 8.45627 30.965 6.69794 30.965 5.71127C30.965 5.51877 30.965
|
|
|
|
|
|
/// 5.32544 30.955 5.13377C30.9033 4.40377 30.4683 3.92711 29.8883 3.76711C29.1525 3.56378 28.2767 3.93377 27.9383
|
|
|
|
|
|
/// 4.56711C27.72 4.97461 27.7 5.31211 27.6692 5.77544C27.61 6.66211 27.6517 8.55294 27.6517 9.44211H26.1075C26.1075
|
|
|
|
|
|
/// 8.50377 26.1075 6.60877 26.1075 5.67377C26.1132 5.44061 26.1035 5.20732 26.0783 4.97544C25.9692 4.23794 25.5633
|
|
|
|
|
|
/// 3.86544 24.9558 3.74628C24.1792 3.59461 23.43 3.95211 23.0892 4.49628C22.9212 4.86271 22.8307 5.2599 22.8233
|
|
|
|
|
|
/// 5.66294L22.8083 9.44211L21.2575 9.44627ZM3.68583 7.96169C4.86 7.95669 5.69417 7.11919 5.70667 5.93419C5.72 4.72003
|
|
|
|
|
|
/// 4.865 3.85086 3.66417 3.85086C2.46333 3.85086 1.64167 4.71169 1.66417 5.95336C1.68167 7.15669 2.5 7.96752 3.68583
|
|
|
|
|
|
/// 7.96169ZM7.26917 9.44669H5.73L5.7225 8.59753C5.27225 8.96135 4.74445 9.21691 4.17981 9.34449C3.61517 9.47207 3.02877
|
|
|
|
|
|
/// 9.46826 2.46583 9.33336C1.74 9.16669 1.15833 8.74169 0.715833 8.14086C-0.305 6.76586 -0.215833 4.68669 0.911667
|
|
|
|
|
|
/// 3.42503C2.03917 2.16336 3.97 2.03002 5.72583 3.10752V2.38086H7.2725L7.26917 9.44669ZM16.84 9.43881C14.6783 9.43881
|
|
|
|
|
|
/// 13.18 7.99548 13.1825 5.91215C13.1825 3.85381 14.7367 2.36465 16.86 2.38298C18.9583 2.40048 20.4742 3.86798 20.4917
|
|
|
|
|
|
/// 5.89715C20.5092 7.96048 18.9858 9.43798 16.84 9.43881ZM16.8183 7.99131C18 7.99965 18.8333 7.16631 18.8533
|
|
|
|
|
|
/// 5.97215C18.8758 4.74215 18.0383 3.85715 16.8458 3.85131C15.6533 3.84548 14.7908 4.72881 14.8017 5.94465C14.8133
|
|
|
|
|
|
/// 7.13048 15.655 7.98465 16.8183 7.99131ZM8.80917 0.0214844H10.3592V2.37898H12.3467V3.85732H10.3592C10.3592 3.85732
|
|
|
|
|
|
/// 10.3375 6.13732 10.3592 7.00232C10.3775 7.75232 10.605 7.93482 11.3408 7.96315C11.6508 7.97482 11.9617 7.96315
|
|
|
|
|
|
/// 12.3408 7.96315V9.44482C11.9908 9.43732 10.7817 9.47732 10.1933 9.33398C9.50417 9.17565 9.07333 8.69982 8.91583
|
|
|
|
|
|
/// 8.00648C8.84948 7.72704 8.81399 7.44117 8.81 7.15398C8.80083 4.94482 8.79417 0.241484 8.80917 0.0214844ZM36.9117
|
|
|
|
|
|
/// 7.96169C38.0858 7.95669 38.92 7.11919 38.9325 5.93419C38.9458 4.72003 38.0908 3.85086 36.8908 3.85086C35.6908
|
|
|
|
|
|
/// 3.85086 34.8675 4.71169 34.8908 5.95336C34.9075 7.15669 35.7242 7.96752 36.9117 7.96169ZM40.495
|
|
|
|
|
|
/// 9.44669H38.9558L38.9483 8.59753C38.4981 8.96135 37.9703 9.21691 37.4056 9.34449C36.841 9.47207 36.2546 9.46826
|
|
|
|
|
|
/// 35.6917 9.33336C34.9658 9.16669 34.3842 8.74169 33.9417 8.14086C32.9208 6.76586 33.01 4.68669 34.1375 3.42503C35.265
|
|
|
|
|
|
/// 2.16336 37.1958 2.03002 38.9517 3.10752V2.38086H40.4983L40.495 9.44669ZM42.035
|
|
|
|
|
|
/// 0.0214844H43.5833V2.37898H45.5708V3.85732H43.5833C43.5833 3.85732 43.5617 6.13732 43.5833 7.00232C43.6025 7.75232
|
|
|
|
|
|
/// 43.8333 7.93482 44.565 7.96315C44.875 7.97482 45.1858 7.96315 45.565 7.96315V9.44482C45.2158 9.43732 44.0058 9.47732
|
|
|
|
|
|
/// 43.4175 9.33398C42.7283 9.17565 42.2983 8.69982 42.14 8.00648C42.0736 7.72704 42.0382 7.44117 42.0342
|
|
|
|
|
|
/// 7.15398C42.0267 4.94482 42.0208 0.241484 42.035 0.0214844ZM53.8108 7.96169C54.985 7.95669 55.8192 7.11919 55.8317
|
|
|
|
|
|
/// 5.93419C55.845 4.72003 54.99 3.85086 53.79 3.85086C52.59 3.85086 51.7667 4.71169 51.79 5.95336C51.8067 7.15669
|
|
|
|
|
|
/// 52.6233 7.96753 53.8108 7.96169ZM57.3942 11.92H55.855L55.8475 8.59753C55.3972 8.96135 54.8695 9.21691 54.3048
|
|
|
|
|
|
/// 9.34449C53.7402 9.47207 53.1538 9.46826 52.5908 9.33336C51.865 9.16669 51.2833 8.74169 50.8408 8.14086C49.82 6.76586
|
|
|
|
|
|
/// 49.9092 4.68669 51.0367 3.42503C52.1642 2.16336 54.095 2.03002 55.8508 3.10752V2.38086H57.3975L57.3942
|
|
|
|
|
|
/// 11.92ZM47.0908 2.25022L48.6375 0.673555V0.0185547H47.0908V2.25022ZM48.6375 2.91699L47.0908
|
|
|
|
|
|
/// 4.49366V9.44532H48.6375V2.91699Z" Fill="White"/><Ellipse Width = "4" Height="4" VerticalAlignment="Center"
|
|
|
|
|
|
/// Margin="40 0 0 0" Fill="#E5FF00"/><TextBlock Foreground = "White" VerticalAlignment="Center" Margin="40 0 0 0"
|
|
|
|
|
|
/// Text="custom aec software development"/><Ellipse Width = "4" Height="4" VerticalAlignment="Center" Margin="40 0"
|
2025-04-24 20:56:44 +08:00
|
|
|
|
/// Fill="#E5FF00"/></AutoStackPanel></DataTemplate></controls:RunningLine.LineTemplate>
|
2025-02-10 20:53:40 +08:00
|
|
|
|
/// </example>
|
|
|
|
|
|
public class RunningLine : ContentControl
|
|
|
|
|
|
{
|
|
|
|
|
|
public static readonly DependencyProperty AnimationSpeedProperty = DependencyProperty.Register(
|
|
|
|
|
|
nameof(AnimationSpeed),
|
|
|
|
|
|
typeof(double),
|
|
|
|
|
|
typeof(RunningLine),
|
|
|
|
|
|
new PropertyMetadata(0.2d));
|
|
|
|
|
|
public static readonly DependencyProperty LineTemplateProperty = DependencyProperty.Register(
|
|
|
|
|
|
nameof(LineTemplate),
|
|
|
|
|
|
typeof(DataTemplate),
|
|
|
|
|
|
typeof(RunningLine),
|
|
|
|
|
|
new PropertyMetadata(default(DataTemplate)));
|
|
|
|
|
|
|
|
|
|
|
|
public RunningLine() { Loaded += OnLoaded; }
|
|
|
|
|
|
|
|
|
|
|
|
private void EvaluatePlaceholders(ItemsControl panel)
|
|
|
|
|
|
{
|
|
|
|
|
|
panel.Items.Add(null);
|
|
|
|
|
|
panel.UpdateLayout();
|
|
|
|
|
|
|
|
|
|
|
|
var placeholdersCount = (int)(ActualWidth / panel.ActualWidth);
|
|
|
|
|
|
var placeholders = Enumerable.Repeat((string)null, placeholdersCount);
|
|
|
|
|
|
foreach(var item in placeholders)
|
|
|
|
|
|
panel.Items.Add(item);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void OnLoaded(object sender, RoutedEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
var rootPanel = (ItemsControl)Template.FindName("RootPanel", this);
|
|
|
|
|
|
var rootPanelNext = (ItemsControl)Template.FindName("RootPanelNext", this);
|
|
|
|
|
|
|
|
|
|
|
|
EvaluatePlaceholders(rootPanel);
|
|
|
|
|
|
EvaluatePlaceholders(rootPanelNext);
|
|
|
|
|
|
|
|
|
|
|
|
RunAnimation(rootPanel, rootPanelNext);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private async void RunAnimation(ItemsControl panel, ItemsControl panelNext)
|
|
|
|
|
|
{
|
|
|
|
|
|
panel.UpdateLayout();
|
|
|
|
|
|
panelNext.UpdateLayout();
|
|
|
|
|
|
|
|
|
|
|
|
var animation = new DoubleAnimation
|
|
|
|
|
|
{
|
|
|
|
|
|
From = 0,
|
|
|
|
|
|
To = -panel.ActualWidth,
|
|
|
|
|
|
RepeatBehavior = RepeatBehavior.Forever
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
var animationNext = new DoubleAnimation
|
|
|
|
|
|
{
|
|
|
|
|
|
From = ActualWidth,
|
|
|
|
|
|
To = ActualWidth - panel.ActualWidth,
|
|
|
|
|
|
RepeatBehavior = RepeatBehavior.Forever
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
animation.Duration = TimeSpan.FromMilliseconds((animation.From.Value - animation.To.Value) / AnimationSpeed);
|
|
|
|
|
|
animationNext.Duration = TimeSpan.FromMilliseconds(
|
|
|
|
|
|
(animationNext.From.Value - animationNext.To.Value) / AnimationSpeed);
|
|
|
|
|
|
animationNext.BeginTime = TimeSpan.FromMilliseconds(-animationNext.To.Value / AnimationSpeed);
|
|
|
|
|
|
|
|
|
|
|
|
panel.BeginAnimation(Canvas.LeftProperty, animation);
|
|
|
|
|
|
panelNext.BeginAnimation(Canvas.LeftProperty, animationNext);
|
|
|
|
|
|
|
|
|
|
|
|
await Task.Delay(animationNext.BeginTime.Value);
|
|
|
|
|
|
panelNext.Visibility = Visibility.Visible;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public double AnimationSpeed
|
|
|
|
|
|
{
|
|
|
|
|
|
get => (double)GetValue(AnimationSpeedProperty);
|
|
|
|
|
|
set => SetValue(AnimationSpeedProperty, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public DataTemplate LineTemplate
|
|
|
|
|
|
{
|
|
|
|
|
|
get => (DataTemplate)GetValue(LineTemplateProperty);
|
|
|
|
|
|
set => SetValue(LineTemplateProperty, value);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|