wpf如何在后台控制wpf 炫酷动画效果

15:17 提问
请教如何在WPF后台修改Grid.ColumnSpan属性?
我在grid里平均上下左右分了四个区域,现在想实现点击界面某个button,
指定的一个区域充满整个grid,即其他三个区域属性为不可见。比如第一个区域初始位置是Grid.Row="0" Grid.Column="0", 点击按钮后如果修改为 Grid.Row="0" Grid.Column="0", Grid.RowSpan="2", Grid.ColumnSpan="2", 那就可以充满整个Grid,但是在WPF后台点击区域对象,找不到XAML里对应Grid的属性?请教大家应该怎么处理啊?
按赞数排序
Grid.SetColumn(button1, 0);
Grid.SetRow(button1, 0);
Grid.SetRowSpan(button1,2);
Grid.SetColumnSpan(button1, 2);
也可以通过改变Row和Column的高度宽度为0来实现啊,
grid.ColumnDefinitions[1].Width = new System.Windows.GridLength(0);
grid.RowDefinitions[1].Height = new System.Windows.GridLength(0);
不能理解为什么要这么做,四个按钮不用分行列隐藏,点击隐藏全部在显示一个不就好了
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐WPF实现左右移动(晃动)动画效果
转载 &更新时间:日 10:40:10 & 作者:柴米油盐酱醋茶-
这篇文章主要为大家详细介绍了WPF实现左右移动或晃动动画效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了WPF实现左右移动效果展示的具体代码,供大家参考,具体内容如下
实现控件或布局的左右移动(晃动)主要用到DoubleAnimation以及Storyboard
布局代码为:
&Grid Width="200" Height="100" Background="MediumAquamarine" Name="GroupboxArea" Canvas.Left="100" Canvas.Top="200"/&
&Button Content="Button" Height="25" Width="78" Click="Button_Click"/&
后台代码为:
private void Button_Click(object sender, RoutedEventArgs e)
DoubleAnimation DAnimation = new DoubleAnimation();
DAnimation.From = 100;//起点
DAnimation.To = 280;//终点
DAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.5));//时间
Storyboard.SetTarget(DAnimation, GroupboxArea);
Storyboard.SetTargetProperty(DAnimation, new PropertyPath(Canvas.LeftProperty));
Storyboard story = new Storyboard();
story.Completed += new EventHandler(story_Completed);//完成后要做的事
//story.RepeatBehavior = RepeatBehavior.F//无限次循环,需要的自己加上
story.Children.Add(DAnimation);
story.Begin();
void story_Completed(object sender, EventArgs e)
DoubleAnimation DAnimation = new DoubleAnimation();
DAnimation.From = 280;//起点
DAnimation.To = 100;//终点
DAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.5));//时间
Storyboard.SetTarget(DAnimation, GroupboxArea);
Storyboard.SetTargetProperty(DAnimation, new PropertyPath(Canvas.LeftProperty));
Storyboard story = new Storyboard();
story.Completed += new EventHandler(storyCompleted);//完成后要做的事
//story.RepeatBehavior = RepeatBehavior.F//无限次循环,需要的自己加上
story.Children.Add(DAnimation);
story.Begin();
void storyCompleted(object sender, EventArgs e)
DoubleAnimation DAnimation = new DoubleAnimation();
DAnimation.From = 100;//起点
DAnimation.To = 200;//终点
DAnimation.Duration = new Duration(TimeSpan.FromSeconds(0.5));//时间
Storyboard.SetTarget(DAnimation, GroupboxArea);
Storyboard.SetTargetProperty(DAnimation, new PropertyPath(Canvas.LeftProperty));
Storyboard story = new Storyboard();
//story.Completed += new EventHandler(storyCompleted);//完成后要做的事
//story.RepeatBehavior = RepeatBehavior.F//无限次循环,需要的自己加上
story.Children.Add(DAnimation);
story.Begin();
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具运行效果:
前台代码:
[csharp]&&
&Window&x&:Class="Waiting.Window1"&&
&&&&&&&&xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&&
&&&&&&&&xmlns:x&="http://schemas.microsoft.com/winfx/2006/xaml"&&
&&&&&&&&Title="后台忙"&Height="94.635"&Width="197.361"&&&
&&&&&Grid&&&&
&&&&&&&&&Button&Content&="开始"&HorizontalAlignment="Left"&Margin="10,10,0,0"&Name&="button1"&VerticalAlignment="Top"&Click="button1_Click"&Width&="48"&/&&&
&&&&&&&&&Label&Name&="lab_pro"&Content=""&Height="25"&VerticalAlignment&="Top"&HorizontalAlignment="Left"&Margin="80,20,0,0"&/&&&
&&&&&&&&&!--动画代码,只要填写name属性即可--&&&
&&&&&&&&&Grid&Name&="loading"&Visibility="Collapsed"&Height="41"&Grid.Row&="0"&VerticalAlignment="Top"&Margin="126,10,0,0"&HorizontalAlignment="Left"&Width&="42"&&&
&&&&&&&&&&&&&Grid.Resources&&&
&&&&&&&&&&&&&&&&&DrawingBrush&x&:Key="brush"&Stretch="None"&AlignmentX&="Center"&AlignmentY="Top"&&&
&&&&&&&&&&&&&&&&&&&&&DrawingBrush.Drawing&&&
&&&&&&&&&&&&&&&&&&&&&&&&&GeometryDrawing&Brush&="Black"&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&GeometryDrawing.Geometry&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&EllipseGeometry&RadiusX&="2"&RadiusY="5"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/GeometryDrawing.Geometry&&&
&&&&&&&&&&&&&&&&&&&&&&&&&/GeometryDrawing&&&
&&&&&&&&&&&&&&&&&&&&&/DrawingBrush.Drawing&&&
&&&&&&&&&&&&&&&&&/DrawingBrush&&&
&&&&&&&&&&&&&/Grid.Resources&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r01"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="0"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r02"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="30"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r03"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="60"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r04"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="90"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r05"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="120"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r06"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="150"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r07"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="180"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r08"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="210"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r09"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="240"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r10"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="270"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r11"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="300"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Rectangle&x&:Name="r12"&Fill="{StaticResource&brush}"&Opacity&="0.5"&RenderTransformOrigin="0.5,0.5"&&&
&&&&&&&&&&&&&&&&&Rectangle.RenderTransform&&&
&&&&&&&&&&&&&&&&&&&&&RotateTransform&Angle&="330"/&&&
&&&&&&&&&&&&&&&&&/Rectangle.RenderTransform&&&
&&&&&&&&&&&&&/Rectangle&&&
&&&&&&&&&&&&&Grid.Triggers&&&
&&&&&&&&&&&&&&&&&EventTrigger&RoutedEvent&="Grid.Loaded"&&&
&&&&&&&&&&&&&&&&&&&&&BeginStoryboard&&&
&&&&&&&&&&&&&&&&&&&&&&&&&Storyboard&RepeatBehavior&="Forever"&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r01"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.00000"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r02"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.08333"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r03"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.16666"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r04"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.24999"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r05"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.33332"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r06"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.41665"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r07"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.49998"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r08"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.58331"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r09"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.66664"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r10"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.74997"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r11"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.83330"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&DoubleAnimation&Storyboard.TargetName&="r12"&Storyboard.TargetProperty="Opacity"&AutoReverse="True"&Duration="0:0:0.08333"&BeginTime&="0:0:0.91663"&To="0"/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&/Storyboard&&&
&&&&&&&&&&&&&&&&&&&&&/BeginStoryboard&&&
&&&&&&&&&&&&&&&&&/EventTrigger&&&
&&&&&&&&&&&&&/Grid.Triggers&&&
&&&&&&&&&/Grid&&&&&&&&&&&&&&&&&&
&&&&&/Grid&&&&
&/Window&&&
后台代码:
[csharp]&&
using&System.Collections.G&&
using&System.ComponentM&&
using&System.L&&
using&System.T&&
using&System.W&&
using&System.Windows.C&&
using&System.Windows.D&&
using&System.Windows.D&&
using&System.Windows.I&&
using&System.Windows.M&&
using&System.Windows.Media.I&&
using&System.Windows.S&&
namespace&Waiting&&
&&&&public&partial&class&Window1&:&Window&&
&&&&&&&&public&Window1()&&
&&&&&&&&{&&
&&&&&&&&&&&&InitializeComponent();&&
&&&&&&&&}&&
&&&&&&&&BackgroundWorker&bgM&&
&&&&&&&&private&void&button1_Click(object&sender,&RoutedEventArgs&e)&&
&&&&&&&&{&&
&&&&&&&&&&&&bgMeet&=&new&BackgroundWorker&();&&
&&&&&&&&&&&&
&&&&&&&&&&&&bgMeet.WorkerReportsProgress&=&&&
&&&&&&&&&&&&
&&&&&&&&&&&&bgMeet.DoWork&+=&new&DoWorkEventHandler&(bgMeet_DoWork);&&
&&&&&&&&&&&&
&&&&&&&&&&&&bgMeet.ProgressChanged&+=&new&ProgressChangedEventHandler&(bgMeet_ProgressChanged);&&
&&&&&&&&&&&&
&&&&&&&&&&&&bgMeet.RunWorkerCompleted&+=&new&RunWorkerCompletedEventHandler&(bgMeet_RunWorkerCompleted);&&
&&&&&&&&&&&&bgMeet.RunWorkerAsync();&
&&&&&&&&}&&&&&&&&&&&&&&&&
&&&&&&&&void&bgMeet_DoWork(object&sender,&DoWorkEventArgs&e)&&
&&&&&&&&{&&
&&&&&&&&&&&&
&&&&&&&&&&&&this.Dispatcher.Invoke(new&Action(()&=&&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&loading.Visibility&=&System.Windows.&Visibility.V&&
&&&&&&&&&&&&}));&&
&&&&&&&&&&&&
&&&&&&&&&&&&GetData();&&
&&&&&&&&}&&
&&&&&&&&void&bgMeet_ProgressChanged(object&sender,&ProgressChangedEventArgs&e)&&
&&&&&&&&{&&
&&&&&&&&&&&&this.Dispatcher.Invoke(new&Action(()&=&&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&this.lab_pro.Content&=&e.ProgressPercentage&+&"%";&&
&&&&&&&&&&&&}));&&
&&&&&&&&}&&
&&&&&&&&void&bgMeet_RunWorkerCompleted(object&sender,&RunWorkerCompletedEventArgs&e)&&
&&&&&&&&{&&
&&&&&&&&&&&&loading.Visibility&=&System.Windows.&Visibility.C&&
&&&&&&&&&&&&this.Dispatcher.Invoke(new&Action(()&=&&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&this.lab_pro.Content&=&"完成"&;&&
&&&&&&&&&&&&}));&&
&&&&&&&&}&&
&&&&&&&&public&void&GetData()&&
&&&&&&&&{&&
&&&&&&&&&&&&for&(int&i&=&0;&i&&&6;&i++)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&bgMeet.ReportProgress(20*i);&&
&&&&&&&&&&&&&&&&System.Threading.&Thread.Sleep(400);&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
在C#程序中,经常会有一些耗时较长的CPU密集型运算,如果直接在 UI 线程执行这样的运算就会出现UI不响应的问题。解决这类问题的主要途径是使用多线程,启动一个后台线程,把运算操作放在这个后台线程中完成。但是原生接口的线程操作有一些难度,如果要更进一步的去完成线程间的通信就会难上加难。
还好 .NET 类库中提供了一个叫做 BackgroundWorker 的类可以比较优雅的解决这类问题。虽然BackgroundWorker 类使用起来比较简单,但其中还是有一些需要注意的细节,下面我们就通过 demo 程序介绍它的主要用法。我们在 demo中计算1到100的累加和,为了演示,每次计算都 sleep 600毫秒,demo 的UI为:
在窗体上构建一个BackgroundWorker 实例,在它的 DoWork事件处理函数中添加耗时的运算,然后调用它的RunWorkerAsync方法就可以了。
private BackgroundWorker _demoBGWorker = new BackgroundWorker();
_demoBGWorker.DoWork += BGWorker_DoW
_demoBGWorker.RunWorkerAsync();
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
//在这里执行耗时的运算。
int sum = 0;
for (int i = 0; i &= 100; i++)
是不是有点太简单了?那么让我们考虑下面的问题:
如果我们想要把参数传递给运算过程该怎么做?在运算过程中我们希望把实时的信息显示在UI上该怎么办?如果我们想要取消正在进行的运算该怎么办?如果运算过程出现异常我们又该如何处理?
接下来我们就一个一个的处理这些问题。
把参数传递给运算过程
直接把100写死到运算过程中可不好,我们还打算允许用户指定求和的范围呢!所以需要把100作为参数传递给计算过程。在概述中我们通过调用RunWorkerAsync方法启动计算过程,其实这个方法可以接受一个 object 类型的参数。通过它我们就可以把任何数据传递给计算过程:
//别忘了设置滚动条。
this.progressBarSum.Maximum = 100;
_demoBGWorker.RunWorkerAsync(100);
//下面是更新后的 BGWorker_DoWork 方法:
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
//在这里执行耗时的运算。
int endNumber = 0;
if(e.Argument != null)
endNumber = (int)e.A
int sum = 0;
for (int i = 0; i &= endN i++)
BGWorker_DoWork事件处理函数通过参数 e 的Argument属性传来了我们期望的运算信息。
把消息传递给UI
由于计算过程比较长,我们在通过进度条来显示当前进度的同时,还希望能实时的把计算的中间结果显示在UI上。当然,BackgroundWorker对这个用例也提供了很好的支持。它允许我们在执行计算的过程中给UI线程发送消息,下面看看具体的做法:
_demoBGWorker.WorkerReportsProgress =
_demoBGWorker.ProgressChanged += BGWorker_ProgressC
首先要把WorkerReportsProgress 属性设置为 true,然后为ProgressChanged 事件添加处理方法:
private void BGWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
//修改进度条的显示。
this.progressBarSum.Value = e.ProgressP
//如果有更多的信息需要传递,可以使用 e.UserState 传递一个自定义的类型。
//这是一个 object 类型的对象,您可以通过它传递任何类型。
//我们仅把当前 sum 的值通过 e.UserState 传回,并通过显示在窗口上。
string message = e.UserState.ToString();
this.labelSum.Text =
继续更新 BGWorker_DoWork方法:
private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
BackgroundWorker bgWorker = sender as BackgroundW
int endNumber = 0;
if(e.Argument != null)
endNumber = (int)e.A
int sum = 0;
for (int i = 0; i &= endN i++)
string message = "Current sum is: " + sum.ToString();
//ReportProgress 方法把信息传递给 ProcessChanged 事件处理函数。
//第一个参数类型为 int,表示执行进度。
//如果有更多的信息需要传递,可以使用 ReportProgress 的第二个参数。
//这里我们给第二个参数传进去一条消息。
bgWorker.ReportProgress(i, message);
Thread.Sleep(600);
OK,现在已经可以看到进度条和执行信息的更新了。
在执行过程中允许用户取消当前的操作是一个基本的设计,BackgroundWorker自然有很好的支持:
_demoBGWorker.WorkerSupportsCancellation =
和WorkerReportsProgress属性一样,如果要支持取消操作我们需要设置 WorkerSupportsCancellation属性为 true。并且还要在BGWorker_DoWork方法中进行支持,在 for 循环中 Thread.Sleep(600)后面添加代码:
bgWorker.ReportProgress(i, message);
Thread.Sleep(600);
//在操作的过程中需要检查用户是否取消了当前的操作。
if (bgWorker.CancellationPending == true)
e.Cancel =
如果检测到用户点击的取消按钮,就退出当前的计算过程。下面是点击取消按钮时要调用的代码:
_demoBGWorker.CancelAsync();
现在已经可以支持取消操作了,赶快试试吧!
如果在计算过程中发生了异常该怎么处理?有没有办法知道计算过程已经结束?当然要有,即便是正常的结束也需要拿到计算的结果。
_demoBGWorker.RunWorkerCompleted += BGWorker_RunWorkerC
private void BGWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
//如果用户取消了当前操作就关闭窗口。
if (e.Cancelled)
this.Close();
//计算已经结束,需要禁用取消按钮。
this.btnCancel.Enabled =
//计算过程中的异常会被抓住,在这里可以进行处理。
if (e.Error != null)
Type errorType = e.Error.GetType();
switch (errorType.Name)
case "ArgumentNullException":
case "MyException":
//do something.
//do something.
//计算结果信息:e.Result
//use it do something.
RunWorkerCompleted 事件处理函数会在DoWork 事件处理函数返回后被调用。通过它我们可以进行一些运算结束后的操作,比如禁用取消按钮,异常处理,结果显示等。注意,如果想要拿到 e.Result,您需要在BGWorker_DoWork方法中设置 e.Result属性,如:
e.Result =
总结,BackgroundWorker 类功能完善且使用简便,实在是处理异步耗时操作的利器!
阅读(...) 评论()&&&&&&&&&&&
做一个wpf的电子地图,在图上有闪烁的红点表示特定区域,实验代码如下:
xaml代码:
&&&&&&&&&Storyboard&x:Key="Storyboard1"&RepeatBehavior="Forever"&AutoReverse="True"&
&&&&&&&&&&&&&DoubleAnimationUsingKeyFrames&BeginTime="00:00:00"&Storyboard.TargetName="ellipse1"&Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)"&
&&&&&&&&&&&&&&&&&SplineDoubleKeyFrame&KeyTime="00:00:00"&Value="1"/&
&&&&&&&&&&&&&&&&&SplineDoubleKeyFrame&KeyTime="00:00:01"&Value="2"/&
&&&&&&&&&&&&&/DoubleAnimationUsingKeyFrames&
&&&&&&&&&&&&&DoubleAnimationUsingKeyFrames&BeginTime="00:00:00"&Storyboard.TargetName="ellipse1"&Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)"&
&&&&&&&&&&&&&&&&&SplineDoubleKeyFrame&KeyTime="00:00:00"&Value="1"/&
&&&&&&&&&&&&&&&&&SplineDoubleKeyFrame&KeyTime="00:00:01"&Value="2"/&
&&&&&&&&&&&&&/DoubleAnimationUsingKeyFrames&
&&&&&&&&&/Storyboard&
&后台控制代码如下:
&&&&&&&&&&&&my_sb&=&(Storyboard)this.FindResource("Storyboard1");
&&&&&&&&&&&&my_sb.Begin(this);
这个Storyboard的RepeatBehavior="Forever"
现在想做一个控制,让Storyboard可以恢复原状:
首先使用如下代码:
&&&&&&&&&&&&my_sb&=&(Storyboard)this.FindResource("Storyboard1");
&&&&&&&&&&&&my_sb.Stop(this);
&接下来要做一个按钮,能暂停和继续Storyboard,代码如下:
&&&&&&&&&&&&my_sb&=&(Storyboard)this.FindResource("Storyboard1");
&&&&&&&&&&&&bool&state&=&my_sb.GetIsPaused(this);
&&&&&&&&&&&&if&(!state)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&my_sb.Pause(this);
&&&&&&&&&&&&}
&&&&&&&&&&&&if(state)
&&&&&&&&&&&&&&&&my_sb.Resume(this);
&上述代码中my_sb.GetIsPaused(this)判断storyboard当前是不是暂停状态
接下来还要做一个按钮,能停止和启动Storyboard,但是Storyboard没有函数判断Storyboard是否运行状态。应该还要利用clock状态
明天继续做实验。
阅读(...) 评论()温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
在介绍Storyboard之前应该先了解AnimationAnimation提供一种简单的“渐变”动画,我们为一个Animation指定开始值和一个结束值,并指定由开始值到达结束值所需的时间,便可形成一个简单的动画。比如我们指定长方形的宽度由100变化到200,所需时间为1秒,很容易想像这样的动画是什么样的,而它对应的Xaml代码如下:&DoubleAnimation&&&&&&&&&&&&&&&&&Storyboard.TargetName="MyRectangle"&&&&&&&&&&&&&&&&Storyboard.TargetProperty="Width"&&&&&&&&&&&&&&&&From="100"&To="200"&Duration="0:0:1"&/&&&&&&&&将它翻译成C#代码则如下:&DoubleAnimation&myDoubleAnimation&=&new&DoubleAnimation();&&&&&&&&&&&&myDoubleAnimation.From&=&100;&&&&&&&&&&&&myDoubleAnimation.To&=&200;&&&&&&&&&&&&myDoubleAnimation.Duration&=&new&Duration(TimeSpan.FromSeconds(1));&&&&&&&&&&&&Storyboard.SetTargetName(myDoubleAnimation,&myRectangle.Name);&&&&&&&&&&&&Storyboard.SetTargetProperty(myDoubleAnimation,&new&PropertyPath(Rectangle.WidthProperty));代码里我们定义了一个DoubleAnimation,并指定了它的开始值和结束值以及它由开始值到达结束值所需的时间。至于后面两句,它们是用来将Aniamtion与指定的对象和指定的属性相关联,等会我们将介绍。注意到,这里我们使用的是DoubleAnimation,因为我们所要变化的是数值。那么如果我们要变化颜色是不是就用ColorAnimation了呢,对,其实出了这些之外还有PointAnimation等等,并且你可以实现IAnimatable接口来实现自定义版本的Animation。关于这些你可以参见System.Windows.MediaAniamtion名字空间.但值得注意的是并非每个属性都能够使用Animation,它必须满足以下条件:1,它必须是Dependency Property2,它所在类必须继承于DependencyObject,必须实现了IAnimatable接口.3,必须有类型一致的Animation Type(即Color类型使用ColorAniamtion,Point类型使用PointAnimation等)一个简单的Animation定义了一个简单的动画,很容易想到的是,如果若干个Animation同时作用于一个对象,那么这个对象不就可以表现复杂的动画了吗,对,这就是StoryboardStoryboard可以看做是Animation的容器,它包含了若干的简单动画来完成一个复杂动画。参考以下代码:&!--&This&example&shows&how&to&animate&with&a&storyboard.--&&Page&xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&&&xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&&&WindowTitle="Storyboards&Example"&&&&StackPanel&Margin="20"&&&&&&&&&&Rectangle&Name="MyRectangle"&&&&&&Width="100"&&&&&&Height="100"&&&&&&&&Rectangle.Fill&&&&&&&&&&SolidColorBrush&x:Name="MySolidColorBrush"&Color="Blue"&/&&&&&&&&/Rectangle.Fill&&&&&&&&Rectangle.Triggers&&&&&&&&&&EventTrigger&RoutedEvent="Page.Loaded"&&&&&&&&&&&&BeginStoryboard&&&&&&&&&&&&&&Storyboard&RepeatBehavior="Forever"&AutoReverse="True"&&&&&&&&&&&&&&&&DoubleAnimation&&&&&&&&&&&&&&&&&Storyboard.TargetName="MyRectangle"&&&&&&&&&&&&&&&&Storyboard.TargetProperty="Width"&&&&&&&&&&&&&&&&From="100"&To="200"&Duration="0:0:1"&/&&&&&&&&&&&&&&&&&&&&ColorAnimation&&&&&&&&&&&&&&&&&Storyboard.TargetName="MySolidColorBrush"&&&&&&&&&&&&&&&&Storyboard.TargetProperty="Color"&&&&&&&&&&&&&&&&From="Blue"&To="Red"&Duration="0:0:1"&/&&&&&&&&&&&&&&&&&&&&&&&&&&/Storyboard&&&&&&&&&&&&/BeginStoryboard&&&&&&&&&&/EventTrigger&&&&&&&&/Rectangle.Triggers&&&&&&/Rectangle&&&&&/StackPanel&&/Page&这里我们的Storyboard定义了DoubleAnimation来变化矩形的宽度,并定义了ColorAnimation来变化矩形的颜色。至此,你已经可以编写绚丽的WPF动画了,并推荐你下载来制作WPF动画.但你会发现使用XAML标记的方式来编写动画虽然很简单,但缺乏了C#等程序设计语言的灵活性,比如我们的矩形动画中矩形的宽度是由后台逻辑计算出来的变量值,我们的动画将如何编写呢,这时我更喜欢使用C#的方式来编写动画,虽然这所需的代码量更大.以下重点介绍如何用C#编写动画,并且这更助于你理解Storyboard是如何工作的。参考以下代码:&&&&&&&&&&&&this.Name&=&"PageMain";&&&&&&&&&&&&myRectangle.Name&=&"MyRectangle";&&&&&&&&&&&&&&&&&&&&&&&&&&NameScope.SetNameScope(this,&new&NameScope());&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&this.RegisterName(myRectangle.Name,&myRectangle);&&&&&&&&&&&&DoubleAnimation&myDoubleAnimation&=&new&DoubleAnimation();&&&&&&&&&&&&myDoubleAnimation.From&=&100;&&&&&&&&&&&&myDoubleAnimation.To&=&200;&&&&&&&&&&&&myDoubleAnimation.Duration&=&new&Duration(TimeSpan.FromSeconds(1));&&&&&&&&&&&&Storyboard.SetTargetName(myDoubleAnimation,&myRectangle.Name);&&&&&&&&&&&&Storyboard.SetTargetProperty(myDoubleAnimation,&new&PropertyPath(Rectangle.WidthProperty));&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&Storyboard&myStoryboard&=&new&Storyboard();&&&&&&&&&&&&myStoryboard.Children.Add(myDoubleAnimation);&&&&&&&&&&&&this.Loaded&+=&delegate(object&sender,&MouseEventArgs&e)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&myStoryboard.Begin(this);&&&&&&&&&&&&};其中:&&&&&&&&&&& DoubleAnimation&myDoubleAnimation&=&new&DoubleAnimation();&&&&&&&&&&&&myDoubleAnimation.From&=&100;&&&&&&&&&&&&myDoubleAnimation.To&=&200;&&&&&&&&&&&&myDoubleAnimation.Duration&=&new&Duration(TimeSpan.FromSeconds(1));定义了一个DoubleAniamtion,并指定了它的开始值和结束值以及所需的时间.Storyboard.SetTargetName(myDoubleAnimation,&myRectangle.Name);设置myDoubleAniamtion的作用对象是"myRectangle",注意到传入的第二个参数是一个字符串myRectangle.Name,那么我们的程序怎么知道"myRectangle"这个字符串就是指我们的矩形对象myRectangle呢,这里存在一个名称与对象的映射,即我们的"myRectangle"映射到矩形对象myRectangle,为了构造这个映射我们涉及到了NameScope(名字域)这个概念.&&&&&&&&&&& NameScope.SetNameScope(this,&new&NameScope());&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&this.RegisterName(myRectangle.Name,&myRectangle);上面的代码中,this设置了一个名字域,myRectagle向这个名字域注册了自己的名字,这样我们的程序就可以通过this的名字域来查找到myRectangle与"myRectangle"之间的映射关系了,关于NameScope可以参见MSDN&WPF Namescopes主题.为了让myDoubleAnimation知道它所作用的属性是谁,我们使用Storyboard.SetTargetProperty(myDoubleAnimation,&new&PropertyPath(Rectangle.WidthProperty));语句来将Aniamtion与属性关联起来,其中PropertyPath中指定要作用的对象所对应的DependencyProperty.然后我们将定义好的myDoubleAniamtion添加到myStoryboard的Children中去.最后就可以通过调用Storyboard的Begin(FrameworkElement)方法来开始我们的动画.Begin方法的另一个重载形式是public&void&Begin&(FrameworkContentElement&containingObject,bool&isControllable),第二个参数表明我们的storyboard是否是可控的,如果可控的话,我们可以像控制播放器一样控制来控制storyboard,关于控制Storyboard请参考Storyboard类中的Pause,Seek等方法.至此也许我们会认为这些知识足以应付简单的动画了,现在让我们一起设计一个简单的动画,也许会发现些问题.假设我们的界面中存在一个Button对象button1,我们设计一个简单的动画让它在窗口中的x坐标从0连续变化到100,然后在从100变化到0,如此重复.也许我们会编写如下的代码:&&&&&&&&&&&&this.button1.Name&=&"button1";&&&&&&&&&&&&this.Name&=&"window1";&&&&&&&&&&&&NameScope.SetNameScope(this,&new&NameScope());&&&&&&&&&&&&this.RegisterName(this.button1.Name,&this.button1);&&&&&&&&&&&&DoubleAnimation&xAnimation&=&new&DoubleAnimation();&&&&&&&&&&&&xAnimation.From&=&0;&&&&&&&&&&&&xAnimation.To&=&100;&&&&&&&&&&&&xAnimation.Duration&=&new&Duration(TimeSpan.FromSeconds(1));&&&&&&&&&&&&Storyboard&story&=&new&Storyboard();&&&&&&&&&&&&story.AutoReverse&=&true;&&&&&&&&&&&&story.RepeatBehavior&=&RepeatBehavior.F&&&&&&&&&&&&story.Children.Add(xAnimation);&&&&&&&&&&&&Storyboard.SetTargetName(xAnimation,&this.button1.Name);&&&&&&&&&&&&Storyboard.SetTargetProperty(xAnimation,&???);但当我们编写到Storyboard.SetTargetProperty(xAnimation,&???);时发现似乎不知道将我们的xAniamtion关联到哪个属性.似乎Button中没有用来控制X坐标的DependencyProperty.但通过研究后发现(你可以通过ExpressionBlend自动生成的XAML代码来发现这些信息),如果我们将button1的RenderTransform设置为TranslateTransform,然后可以通过TranslateTransform的XProperty属性来更改button1的X坐标.注意到,我们并不是像以前一样直接关联到Button的某个属性(比如先前的WidthProperty),而是通过其RenderTransformProperty属性的XProperty来间接关联的,这中方式叫做"属性链"(PropertyChain).参考下面的代码:&&&&&&&&&&&&DependencyProperty[]&propertyChain&=&new&DependencyProperty[]&&&&&&&&&&&&{&&&&&&&&&&&&&&&&Button.RenderTransformProperty,&&&&&&&&&&&&&&&&TranslateTransform.XProperty&&&&&&&&&&&&};&&&&&&&&&&&&Storyboard.SetTargetProperty(xAnimation,&new&PropertyPath("(0).(1)",&propertyChain));为了构造PropertyChain,我们先定义一个DependencyProperty的数组,注意数组的元素是怎么来的,它按照属性链的"链条"关系依次书写,直到到达我们最终要修改的属性,(由于我们是通过将RenderTransformProperty设置为TranslateTransform类型,所以第二个元素是TranslateTransform.XProperty),简单地说就是(类型1.属性1,类型2.属性2,....类型n.属性n),其中类型i是属性i-1的类型或可以与之转换的类型.这样我们的代码就演化如下:&&&&&&&&&&&&this.button1.RenderTransform&=&new&TranslateTransform();&&&&&&&&&&&&this.button1.Name&=&"button1";&&&&&&&&&&&&this.Name&=&"window1";&&&&&&&&&&&&NameScope.SetNameScope(this,&new&NameScope());&&&&&&&&&&&&this.RegisterName(this.button1.Name,&this.button1);&&&&&&&&&&&&DoubleAnimation&xAnimation&=&new&DoubleAnimation();&&&&&&&&&&&&xAnimation.From&=&0;&&&&&&&&&&&&xAnimation.To&=&100;&&&&&&&&&&&&xAnimation.Duration&=&new&Duration(TimeSpan.FromSeconds(1));&&&&&&&&&&&&DependencyProperty[]&propertyChain&=&new&DependencyProperty[]&&&&&&&&&&&&{&&&&&&&&&&&&&&&&Button.RenderTransformProperty,&&&&&&&&&&&&&&&&TranslateTransform.XProperty&&&&&&&&&&&&};&&&&&&&&&&&&Storyboard&story&=&new&Storyboard();&&&&&&&&&&&&story.AutoReverse&=&true;&&&&&&&&&&&&story.RepeatBehavior&=&RepeatBehavior.F&&&&&&&&&&&&story.Children.Add(xAnimation);&&&&&&&&&&&&Storyboard.SetTargetName(xAnimation,&this.button1.Name);&&&&&&&&&&&&Storyboard.SetTargetProperty(xAnimation,&new&PropertyPath("(0).(1)",&propertyChain));&&&&&&&&&&&&story.Begin(this);注意:如果你收到关于PropertyChain的运行时错误或动画没有效果,那么你应该初始化button的RenderTransform属性,所以我们添加了this.button1.RenderTransform = new TranslateTransform();语句.
阅读(3301)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'WPF中的动画(转)',
blogAbstract:'动画无疑是WPF中最吸引人的特色之一,其可以像Flash一样平滑地播放并与程序逻辑进行很好的交互。这里我们讨论一下故事板。在WPF中我们采用Storyboard(故事板)的方式来编写动画,为了对Storyboard有个大概的印象,你可以粘贴以下代码到XamlPad来查看效果:',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:1,
publishTime:5,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:1,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'0',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 wpf动画效果实例 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信