namespace Yw.WinFrmUI
|
{
|
/// <summary>
|
/// 步骤管理器
|
/// </summary>
|
public class WizardManager<T> : IWizardManager<T> where T : class, new()
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public WizardManager(T t)
|
{
|
_vm = t;
|
}
|
|
|
#region 事件
|
|
/// <summary>
|
/// 选择页面改变事件
|
/// </summary>
|
public event Action<IWizardPage<T>, int> SelectedPageChangedEvent;
|
|
/// <summary>
|
/// 选择页面状态改变事件
|
/// </summary>
|
public event Action<IWizardPage<T>, int> SelectedPageStateChangedEvent;
|
|
#endregion
|
|
#region 初始化
|
|
/// <summary>
|
/// 初始化管理器
|
/// </summary>
|
/// <param name="pages">步骤页面数组</param>
|
public virtual void InitialManager(IWizardPage<T>[] pages)
|
{
|
_pages = pages;
|
if (_pages != null && _pages.Length > 0)
|
{
|
_isInitialize = true;
|
foreach (var page in _pages)
|
{
|
page.PageStateChangedEvent += () =>
|
{
|
if (page == this.SelectedPage)
|
{
|
TriggerSelectedPageStateChangedEvent();
|
}
|
};
|
}
|
_selectedIndex = 0;
|
this.SelectedPage.InitialPage(_vm);
|
TriggerSelectedPageChangedEvent();
|
}
|
else
|
{
|
_isInitialize = false;
|
}
|
}
|
|
/// <summary>
|
/// 步骤页面数组
|
/// </summary>
|
protected IWizardPage<T>[] _pages;
|
|
/// <summary>
|
/// 是否初始化
|
/// </summary>
|
protected bool _isInitialize = false;
|
|
/// <summary>
|
/// vm对象
|
/// </summary>
|
protected readonly T _vm = null;
|
|
#endregion
|
|
#region 选择
|
|
/// <summary>
|
/// 选择页面
|
/// </summary>
|
public virtual IWizardPage<T> SelectedPage
|
{
|
get
|
{
|
if (_isInitialize)
|
{
|
return _pages[this.SelectedIndex];
|
}
|
return default;
|
}
|
}
|
|
/// <summary>
|
/// 选择索引
|
/// </summary>
|
public virtual int SelectedIndex
|
{
|
get { return _selectedIndex; }
|
}
|
|
/// <summary>
|
/// 选择索引
|
/// </summary>
|
protected int _selectedIndex;
|
|
#endregion
|
|
#region 操作
|
|
/// <summary>
|
/// 上一步
|
/// </summary>
|
public virtual bool Prev()
|
{
|
if (!_isInitialize)
|
{
|
return false;
|
}
|
if (!this.SelectedPage.AllowPrev)
|
{
|
return false;
|
}
|
if (this.SelectedPage.CanPrev())
|
{
|
--_selectedIndex;
|
this.SelectedPage.InitialPage(_vm);
|
TriggerSelectedPageChangedEvent();
|
return true;
|
}
|
return false;
|
}
|
|
/// <summary>
|
/// 下一步
|
/// </summary>
|
public virtual bool Next()
|
{
|
if (!_isInitialize)
|
{
|
return false;
|
}
|
if (!this.SelectedPage.AllowNext)
|
{
|
return false;
|
}
|
if (this.SelectedPage.CanNext())
|
{
|
++_selectedIndex;
|
this.SelectedPage.InitialPage(_vm);
|
TriggerSelectedPageChangedEvent();
|
return true;
|
}
|
return false;
|
}
|
|
/// <summary>
|
/// 取消
|
/// </summary>
|
public virtual bool Cancel()
|
{
|
if (!_isInitialize)
|
{
|
return false;
|
}
|
if (!this.SelectedPage.AllowCancel)
|
{
|
return false;
|
}
|
if (this.SelectedPage.CanCancel())
|
{
|
return true;
|
}
|
return false;
|
}
|
|
/// <summary>
|
/// 完成
|
/// </summary>
|
public virtual bool Complete()
|
{
|
if (!_isInitialize)
|
{
|
return false;
|
}
|
if (!this.SelectedPage.AllowComplete)
|
{
|
return false;
|
}
|
if (this.SelectedPage.CanComplete())
|
{
|
return true;
|
}
|
return false;
|
}
|
|
#endregion
|
|
#region 方法
|
|
/// <summary>
|
/// 触发选择页面改变事件
|
/// </summary>
|
protected void TriggerSelectedPageChangedEvent()
|
{
|
this.SelectedPageChangedEvent?.Invoke(this.SelectedPage, this.SelectedIndex);
|
}
|
|
/// <summary>
|
/// 触发选择页面状态改变事件
|
/// </summary>
|
protected void TriggerSelectedPageStateChangedEvent()
|
{
|
this.SelectedPageStateChangedEvent?.Invoke(this.SelectedPage, this.SelectedIndex);
|
}
|
|
#endregion
|
|
|
}
|
}
|