如何在C#中为画布上的线设置动画?你会如何在屏幕上画一条线?我试图在C#/ WPF项目中的画布上设置动画线。我想使用C#代码而不是XML。谢谢。
2 回答
心有法竹
TA贡献1866条经验 获得超5个赞
我有一个运行的示例,它使用MVVM模式并在其中创建ListBox
具有Canvas
as的行ItemsPanel
。
我实际上是为这个问题而做的,但OP有点消失了,从来没有和我联系过。
这就是我的电脑中的样子:
它的主要部分是:
<ListBox ItemsSource="{Binding}" x:Name="lst" Height="500" Width="500"> <ListBox.ItemsPanel> <ItemsPanelTemplate> <Canvas IsItemsHost="True"/> </ItemsPanelTemplate> </ListBox.ItemsPanel> <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="FocusVisualStyle"> <Setter.Value> <Style TargetType="Control"> <Setter Property="Opacity" Value="0"/> </Style> </Setter.Value> </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="ListBoxItem"> <Line X1="{Binding X1}" Y1="{Binding Y1}" X2="{Binding X2}" Y2="{Binding Y2}" StrokeThickness="{Binding Thickness}" Opacity="{Binding Opacity}" x:Name="Line"> <Line.Stroke> <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> <GradientStop Color="{Binding Color1}" Offset="0"/> <GradientStop Color="{Binding Color2}" Offset="1"/> </LinearGradientBrush> </Line.Stroke> </Line> <ControlTemplate.Triggers> <Trigger Property="IsSelected" Value="true"> <Setter Property="Effect" TargetName="Line"> <Setter.Value> <DropShadowEffect Color="CornflowerBlue" ShadowDepth="3" BlurRadius="10"/> </Setter.Value> </Setter> </Trigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> </ListBox.ItemContainerStyle> </ListBox>
视图模型:
public class LineViewModel : INotifyPropertyChanged { #region Timer-based Animation private System.Threading.Timer Timer; private static Random Rnd = new Random(); private bool _animate; public bool Animate { get { return _animate; } set { _animate = value; NotifyPropertyChanged("Animate"); if (value) StartTimer(); else StopTimer(); } } private int _animationSpeed = 1; public int AnimationSpeed { get { return _animationSpeed; } set { _animationSpeed = value; NotifyPropertyChanged("AnimationSpeed"); if (Timer != null) Timer.Change(0, 100/value); } } private static readonly List<int> _animationSpeeds = new List<int>{1,2,3,4,5}; public List<int> AnimationSpeeds { get { return _animationSpeeds; } } public void StartTimer() { StopTimer(); Timer = new Timer(x => Timer_Tick(), null, 0, 100/AnimationSpeed); } public void StopTimer() { if (Timer != null) { Timer.Dispose(); Timer = null; } } private void Timer_Tick() { X1 = X1 + Rnd.Next(-2, 3); Y1 = Y1 + Rnd.Next(-2, 3); X2 = X2 + Rnd.Next(-2, 3); Y2 = Y2 + Rnd.Next(-2, 3); } #endregion #region Coordinates private double _x1; public double X1 { get { return _x1; } set { _x1 = value; NotifyPropertyChanged("X1"); } } private double _y1; public double Y1 { get { return _y1; } set { _y1 = value; NotifyPropertyChanged("Y1"); } } private double _x2; public double X2 { get { return _x2; } set { _x2 = value; NotifyPropertyChanged("X2"); } } private double _y2; public double Y2 { get { return _y2; } set { _y2 = value; NotifyPropertyChanged("Y2"); } } #endregion #region Other Properties private string _name; public string Name { get { return _name; } set { _name = value; NotifyPropertyChanged("Name"); } } private double _thickness; public double Thickness { get { return _thickness; } set { _thickness = value; NotifyPropertyChanged("Thickness"); } } public Color Color1 { get; set; } public Color Color2 { get; set; } private double _opacity = 1; public double Opacity { get { return _opacity; } set { _opacity = value; NotifyPropertyChanged("Opacity"); } } #endregion #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; private void NotifyPropertyChanged(string propertyName) { Application.Current.Dispatcher.BeginInvoke((Action)(() => { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); })); } #endregion }
编辑:GitHub上的源代码
- 2 回答
- 0 关注
- 428 浏览
添加回答
举报
0/150
提交
取消