利用WPF 状态切换效果可以在WinForm 中做出如网页Flash 效果
主要代码如下:
WPF 部份
using System;
using Microsoft.Expression.Interactivity.Core;
using Microsoft.Expression.Media.Effects;
using System.Windows.Controls;
using System.Windows;
using System.Data;
using System.IO;
using System.Linq;
using System.Windows.Media.Imaging;
namespace WPFViewControls.PhotoView
{
/// <summary>
/// 带有数据的状态视图
/// </summary>
public class DataVisualState : IDisposable
{
internal DataVisualState(StateSource stateSource)
{
ss = stateSource;
vt = new VisualTransition();
effectHelper = new StateEffectHelper();
}
StateSource ss;
VisualTransition vt;
StateEffectHelper effectHelper;
int imageIndex = 0;
/// <summary>
/// 初始化
/// </summary>
public void InitialState()
{
if (ss.DataSource.Count >= 1)
{
ss.ResouceImages[1].Source = CreateImage(imgPath);
TransitionState(true);
}
}
private BitmapImage CreateImage(string imgPath)
{
return new BitmapImage(new Uri(imgPath));
}
private string imgPath
{
get { return ss.DataSource[imageIndex].PhotoPath; }
}
/// <summary>
/// 图片切换
/// </summary>
private void ImageRender()
{
ss.ResouceImages[0].Source = CreateImage(imgPath);
ss.ResouceImages[1].Source = CreateImage(imgPath);
ss.ResouceImages = ss.ResouceImages.Reverse().ToArray();
}
/// <summary>
/// 状态切换
/// </summary>
/// <param name="isInit"></param>
private void TransitionState(bool isInit)
{
if (ss.ControlElement == null)
throw new ArgumentException("没有初始化 VisualTransition!" +
"VisualStateGroup! FrameworkElement ! 请先执行 InitStateVisual 方法");
ss.VsGroup.Transitions.Clear();
ss.States = isInit ? ss.States : ss.States = ss.States.Reverse().ToArray();
vt.From = ss.States[0];
vt.To = ss.States[1];
vt.GeneratedDuration = new Duration(TimeSpan.FromSeconds(1.0d));
vt.SetValue(ExtendedVisualStateManager.TransitionEffectProperty, effectHelper.RandomEffect);
ss.VsGroup.Transitions.Add(vt);
ExtendedVisualStateManager.GoToState(ss.ControlElement, ss.States[1], isInit ? false : true);
}
public void NextFrom()
{
if (ss.DataSource.Count >= 2)
{
imageIndex++;
if (imageIndex == ss.DataSource.Count)
imageIndex = 0;
ImageRender();
TransitionState(false);
}