* 多页面框架重构
This commit is contained in:
parent
c0fbc85a76
commit
3a506824d1
@ -834,7 +834,6 @@ namespace Sunny.UI
|
|||||||
set
|
set
|
||||||
{
|
{
|
||||||
date = value;
|
date = value;
|
||||||
TabControl.SelectPage(2);
|
|
||||||
Year = date.Year;
|
Year = date.Year;
|
||||||
Month = date.Month;
|
Month = date.Month;
|
||||||
SetYearMonth(Year, Month);
|
SetYearMonth(Year, Month);
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
|
|
||||||
@ -206,348 +205,6 @@ namespace Sunny.UI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class UITabControlHelper
|
|
||||||
{
|
|
||||||
private readonly ConcurrentDictionary<TabPage, NavMenuItem> PageItems = new ConcurrentDictionary<TabPage, NavMenuItem>();
|
|
||||||
|
|
||||||
private readonly UITabControl tabControl;
|
|
||||||
|
|
||||||
public UITabControlHelper(UITabControl ctrl)
|
|
||||||
{
|
|
||||||
tabControl = ctrl;
|
|
||||||
}
|
|
||||||
|
|
||||||
public NavMenuItem this[int index]
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (index < 0 || index >= tabControl.TabPages.Count)
|
|
||||||
{
|
|
||||||
throw new ArgumentOutOfRangeException();
|
|
||||||
}
|
|
||||||
|
|
||||||
TabPage page = tabControl.TabPages[index];
|
|
||||||
return PageItems.ContainsKey(page) ? PageItems[page] : null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetTipsText(int pageIndex, string tipsText)
|
|
||||||
{
|
|
||||||
TabPage tabPage = CreateTabIfNotExists(pageIndex);
|
|
||||||
tabControl.SetTipsText(tabPage, tipsText);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SetTipsText(Guid pageGuid, string tipsText)
|
|
||||||
{
|
|
||||||
TabPage tabPage = CreateTabIfNotExists(pageGuid);
|
|
||||||
tabControl.SetTipsText(tabPage, tipsText);
|
|
||||||
}
|
|
||||||
|
|
||||||
public UIPage AddPage(int pageIndex, UIPage page)
|
|
||||||
{
|
|
||||||
page.PageIndex = pageIndex;
|
|
||||||
return AddPage(page);
|
|
||||||
}
|
|
||||||
|
|
||||||
public UIPage AddPage(Guid pageGuid, UIPage page)
|
|
||||||
{
|
|
||||||
page.PageGuid = pageGuid;
|
|
||||||
return AddPage(page);
|
|
||||||
}
|
|
||||||
|
|
||||||
public UIPage AddPage(UIPage page)
|
|
||||||
{
|
|
||||||
if (page.PageGuid == Guid.Empty && page.PageIndex < 0)
|
|
||||||
{
|
|
||||||
page.PageGuid = Guid.NewGuid();
|
|
||||||
}
|
|
||||||
|
|
||||||
TabPage tabPage = CreateTabIfNotExists(new NavMenuItem(page));
|
|
||||||
page.Dock = DockStyle.Fill;
|
|
||||||
page.TabPage = tabPage;
|
|
||||||
tabPage.Controls.Add(page);
|
|
||||||
tabPage.Text = page.Text;
|
|
||||||
page.Show();
|
|
||||||
|
|
||||||
return page;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddPages(params UIPage[] pages)
|
|
||||||
{
|
|
||||||
foreach (var page in pages)
|
|
||||||
{
|
|
||||||
AddPage(page);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddPage(int index, UITabControlMenu page)
|
|
||||||
{
|
|
||||||
TabPage tabPage = CreateTabIfNotExists(index);
|
|
||||||
tabPage.Controls.Add(page);
|
|
||||||
page.Dock = DockStyle.Fill;
|
|
||||||
page.Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddPage(int index, UITabControl page)
|
|
||||||
{
|
|
||||||
TabPage tabPage = CreateTabIfNotExists(index);
|
|
||||||
tabPage.Controls.Add(page);
|
|
||||||
page.Dock = DockStyle.Fill;
|
|
||||||
page.Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddPage(Guid guid, UITabControlMenu page)
|
|
||||||
{
|
|
||||||
TabPage tabPage = CreateTabIfNotExists(guid);
|
|
||||||
tabPage.Controls.Add(page);
|
|
||||||
page.Dock = DockStyle.Fill;
|
|
||||||
page.Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void AddPage(Guid guid, UITabControl page)
|
|
||||||
{
|
|
||||||
TabPage tabPage = CreateTabIfNotExists(guid);
|
|
||||||
tabPage.Controls.Add(page);
|
|
||||||
page.Dock = DockStyle.Fill;
|
|
||||||
page.Show();
|
|
||||||
}
|
|
||||||
|
|
||||||
private TabPage CreateTabIfNotExists(NavMenuItem item)
|
|
||||||
{
|
|
||||||
if (item == null) return null;
|
|
||||||
if (item.PageIndex < 0 && item.PageGuid == Guid.Empty) return null;
|
|
||||||
|
|
||||||
for (int i = 0; i < tabControl.TabPages.Count; i++)
|
|
||||||
{
|
|
||||||
TabPage page = tabControl.TabPages[i];
|
|
||||||
|
|
||||||
if (!PageItems.ContainsKey(page))
|
|
||||||
{
|
|
||||||
if (page.Controls.Count == 0)
|
|
||||||
{
|
|
||||||
PageItems.TryAdd(page, item);
|
|
||||||
return page;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (item.PageGuid != Guid.Empty)
|
|
||||||
{
|
|
||||||
if (PageItems[page].PageGuid == item.PageGuid) return page;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (item.PageIndex >= 0 && PageItems[page].PageIndex == item.PageIndex) return page;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
TabPage newPage = new TabPage();
|
|
||||||
newPage.SuspendLayout();
|
|
||||||
newPage.Text = "tabPage" + tabControl.TabPages.Count;
|
|
||||||
tabControl.Controls.Add(newPage);
|
|
||||||
PageItems.TryAdd(newPage, item);
|
|
||||||
newPage.ResumeLayout();
|
|
||||||
return newPage;
|
|
||||||
}
|
|
||||||
|
|
||||||
private TabPage CreateTabIfNotExists(int pageIndex)
|
|
||||||
{
|
|
||||||
return CreateTabIfNotExists(new NavMenuItem("", pageIndex));
|
|
||||||
}
|
|
||||||
|
|
||||||
private TabPage CreateTabIfNotExists(Guid guid)
|
|
||||||
{
|
|
||||||
return CreateTabIfNotExists(new NavMenuItem("", guid));
|
|
||||||
}
|
|
||||||
|
|
||||||
public event TabPageAndUIPageEventHandler TabPageAndUIPageChanged;
|
|
||||||
|
|
||||||
public bool SelectPage(int pageIndex)
|
|
||||||
{
|
|
||||||
if (pageIndex < 0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<UIPage> pages = tabControl.SelectedTab.GetControls<UIPage>();
|
|
||||||
if (pages.Count == 1)
|
|
||||||
{
|
|
||||||
bool isCancel = pages[0].OnPageDeselecting();
|
|
||||||
if (isCancel) return false;
|
|
||||||
pages[0].Translate();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var item in PageItems)
|
|
||||||
{
|
|
||||||
if (item.Value.PageIndex == pageIndex && item.Key != null)
|
|
||||||
{
|
|
||||||
if (tabControl.TabPages.Contains(item.Key))
|
|
||||||
{
|
|
||||||
tabControl.SelectTab(item.Key);
|
|
||||||
TabPageAndUIPageChanged?.Invoke(this, new TabPageAndUIPageArgs(item.Key, item.Value.PageIndex, item.Value.PageGuid));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool SelectPage(Guid guid)
|
|
||||||
{
|
|
||||||
if (guid == Guid.Empty)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
List<UIPage> pages = tabControl.SelectedTab.GetControls<UIPage>();
|
|
||||||
if (pages.Count == 1)
|
|
||||||
{
|
|
||||||
bool isCancel = pages[0].OnPageDeselecting();
|
|
||||||
if (isCancel) return false;
|
|
||||||
pages[0].Translate();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var item in PageItems)
|
|
||||||
{
|
|
||||||
if (item.Value.PageGuid == guid && item.Key != null)
|
|
||||||
{
|
|
||||||
if (tabControl.TabPages.Contains(item.Key))
|
|
||||||
{
|
|
||||||
tabControl.SelectTab(item.Key);
|
|
||||||
TabPageAndUIPageChanged?.Invoke(this, new TabPageAndUIPageArgs(item.Key, item.Value.PageIndex, item.Value.PageGuid));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public UIPage GetPage(int pageIndex)
|
|
||||||
{
|
|
||||||
var pages = GetPages<UIPage>();
|
|
||||||
for (int i = 0; i < pages.Count; i++)
|
|
||||||
{
|
|
||||||
if (pages[i].PageIndex == pageIndex)
|
|
||||||
return pages[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public T GetPage<T>() where T : UIPage
|
|
||||||
{
|
|
||||||
List<T> result = GetPages<T>();
|
|
||||||
return result.Count > 0 ? result[0] : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<T> GetPages<T>() where T : UIPage
|
|
||||||
{
|
|
||||||
List<T> result = new List<T>();
|
|
||||||
foreach (var item in PageItems)
|
|
||||||
{
|
|
||||||
if (item.Key != null)
|
|
||||||
{
|
|
||||||
var tabPage = item.Key;
|
|
||||||
var pages = tabPage.GetControls<T>();
|
|
||||||
for (int i = 0; i < pages.Count; i++)
|
|
||||||
{
|
|
||||||
if (pages[i] is T pg)
|
|
||||||
result.Add(pg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public UIPage GetPage(Guid guid)
|
|
||||||
{
|
|
||||||
if (guid == Guid.Empty) return null;
|
|
||||||
var pages = GetPages<UIPage>();
|
|
||||||
for (int i = 0; i < pages.Count; i++)
|
|
||||||
{
|
|
||||||
if (pages[i].PageGuid == guid)
|
|
||||||
return pages[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RemoveAllPages(bool keepMainPage = true)
|
|
||||||
{
|
|
||||||
var pages = GetPages<UIPage>();
|
|
||||||
foreach (var page in pages)
|
|
||||||
{
|
|
||||||
if (keepMainPage && page.TabPage?.Text == tabControl.MainPage) continue;
|
|
||||||
RemovePage(page.PageIndex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool RemovePage(int pageIndex)
|
|
||||||
{
|
|
||||||
foreach (var item in PageItems)
|
|
||||||
{
|
|
||||||
if (item.Value.PageIndex == pageIndex)
|
|
||||||
{
|
|
||||||
UIPage page = GetPage(pageIndex);
|
|
||||||
if (page != null)
|
|
||||||
{
|
|
||||||
TabPage tabpage = page.TabPage;
|
|
||||||
page.Final();
|
|
||||||
page.Close();
|
|
||||||
page.Dispose();
|
|
||||||
page = null;
|
|
||||||
|
|
||||||
if (tabpage != null)
|
|
||||||
{
|
|
||||||
tabpage.Parent = null;
|
|
||||||
tabpage.Dispose();
|
|
||||||
tabpage = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PageItems.TryRemove(item.Key, out _);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool RemovePage(Guid guid)
|
|
||||||
{
|
|
||||||
if (guid == Guid.Empty) return false;
|
|
||||||
foreach (var item in PageItems)
|
|
||||||
{
|
|
||||||
if (item.Value.PageGuid == guid)
|
|
||||||
{
|
|
||||||
UIPage page = GetPage(guid);
|
|
||||||
if (page != null)
|
|
||||||
{
|
|
||||||
TabPage tabpage = page.TabPage;
|
|
||||||
page.Dispose();
|
|
||||||
page = null;
|
|
||||||
|
|
||||||
if (tabpage != null)
|
|
||||||
{
|
|
||||||
tabpage.Parent = null;
|
|
||||||
tabpage.Dispose();
|
|
||||||
tabpage = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PageItems.TryRemove(item.Key, out _);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class NavMenuItem : ISymbol
|
public class NavMenuItem : ISymbol
|
||||||
{
|
{
|
||||||
public string Text { get; set; }
|
public string Text { get; set; }
|
||||||
@ -623,21 +280,4 @@ namespace Sunny.UI
|
|||||||
Text = text;
|
Text = text;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class TabPageAndUIPageArgs : EventArgs
|
|
||||||
{
|
|
||||||
public TabPage TabPage { get; set; }
|
|
||||||
|
|
||||||
public int PageIndex { get; set; }
|
|
||||||
public Guid PageGuid { get; set; }
|
|
||||||
|
|
||||||
public TabPageAndUIPageArgs(TabPage tabPage, int pageIndex, Guid pageGuid)
|
|
||||||
{
|
|
||||||
TabPage = tabPage;
|
|
||||||
PageIndex = pageIndex;
|
|
||||||
PageGuid = pageGuid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public delegate void TabPageAndUIPageEventHandler(object sender, TabPageAndUIPageArgs e);
|
|
||||||
}
|
}
|
@ -73,9 +73,6 @@ namespace Sunny.UI
|
|||||||
timer.Interval = 500;
|
timer.Interval = 500;
|
||||||
timer.Tick += Timer_Tick;
|
timer.Tick += Timer_Tick;
|
||||||
|
|
||||||
DisposeTabPageAfterRemove = true;
|
|
||||||
AutoClosePage = true;
|
|
||||||
|
|
||||||
tabSelectedForeColor = UIStyles.Blue.TabControlTabSelectedColor;
|
tabSelectedForeColor = UIStyles.Blue.TabControlTabSelectedColor;
|
||||||
tabSelectedHighColor = UIStyles.Blue.TabControlTabSelectedColor;
|
tabSelectedHighColor = UIStyles.Blue.TabControlTabSelectedColor;
|
||||||
_fillColor = UIStyles.Blue.TabControlBackColor;
|
_fillColor = UIStyles.Blue.TabControlBackColor;
|
||||||
@ -86,13 +83,10 @@ namespace Sunny.UI
|
|||||||
TabPageAndUIPageChanged?.Invoke(this, e);
|
TabPageAndUIPageChanged?.Invoke(this, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
public event TabPageAndUIPageEventHandler TabPageAndUIPageChanged;
|
public event EventHandler<TabPageAndUIPageArgs> TabPageAndUIPageChanged;
|
||||||
|
|
||||||
[Browsable(false), DefaultValue(null)]
|
[Browsable(false), DefaultValue(null)]
|
||||||
public IFrame Frame
|
public IFrame Frame { get; set; }
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 禁止控件跟随窗体缩放
|
/// 禁止控件跟随窗体缩放
|
||||||
@ -251,17 +245,17 @@ namespace Sunny.UI
|
|||||||
|
|
||||||
public bool RemovePage(int pageIndex) => Helper.RemovePage(pageIndex);
|
public bool RemovePage(int pageIndex) => Helper.RemovePage(pageIndex);
|
||||||
|
|
||||||
public bool RemovePage(Guid guid) => Helper.RemovePage(guid);
|
public bool RemovePage(Guid pageGuid) => Helper.RemovePage(pageGuid);
|
||||||
|
|
||||||
public void RemoveAllPages(bool keepMainPage = true) => Helper.RemoveAllPages(keepMainPage);
|
public void RemoveAllPages(bool keepMainPage = true) => Helper.RemoveAllPages(keepMainPage);
|
||||||
|
|
||||||
public UIPage GetPage(int pageIndex) => Helper.GetPage(pageIndex);
|
public UIPage GetPage(int pageIndex) => Helper.GetPage(pageIndex);
|
||||||
|
|
||||||
public UIPage GetPage(Guid guid) => Helper.GetPage(guid);
|
public UIPage GetPage(Guid pageGuid) => Helper.GetPage(pageGuid);
|
||||||
|
|
||||||
public void SetTipsText(int pageIndex, string tipsText) => Helper.SetTipsText(pageIndex, tipsText);
|
public void SetTipsText(int pageIndex, string tipsText) => Helper.SetTipsText(pageIndex, tipsText);
|
||||||
|
|
||||||
public void SetTipsText(Guid guid, string tipsText) => Helper.SetTipsText(guid, tipsText);
|
public void SetTipsText(Guid pageGuid, string tipsText) => Helper.SetTipsText(pageGuid, tipsText);
|
||||||
|
|
||||||
public void AddPages(params UIPage[] pages)
|
public void AddPages(params UIPage[] pages)
|
||||||
{
|
{
|
||||||
@ -277,14 +271,6 @@ namespace Sunny.UI
|
|||||||
internal event OnUIPageChanged PageAdded;
|
internal event OnUIPageChanged PageAdded;
|
||||||
internal event OnUIPageChanged PageRemoved;
|
internal event OnUIPageChanged PageRemoved;
|
||||||
|
|
||||||
public void AddPage(int pageIndex, UITabControl page) => Helper.AddPage(pageIndex, page);
|
|
||||||
|
|
||||||
public void AddPage(int pageIndex, UITabControlMenu page) => Helper.AddPage(pageIndex, page);
|
|
||||||
|
|
||||||
public void AddPage(Guid guid, UITabControl page) => Helper.AddPage(guid, page);
|
|
||||||
|
|
||||||
public void AddPage(Guid guid, UITabControlMenu page) => Helper.AddPage(guid, page);
|
|
||||||
|
|
||||||
public T GetPage<T>() where T : UIPage => Helper.GetPage<T>();
|
public T GetPage<T>() where T : UIPage => Helper.GetPage<T>();
|
||||||
|
|
||||||
public List<T> GetPages<T>() where T : UIPage => Helper.GetPages<T>();
|
public List<T> GetPages<T>() where T : UIPage => Helper.GetPages<T>();
|
||||||
@ -672,9 +658,10 @@ namespace Sunny.UI
|
|||||||
e.Graphics.DrawString(TabPages[index].Text, Font, index == SelectedIndex ? tabSelectedForeColor : TabUnSelectedForeColor,
|
e.Graphics.DrawString(TabPages[index].Text, Font, index == SelectedIndex ? tabSelectedForeColor : TabUnSelectedForeColor,
|
||||||
new Rectangle(TabRect.Left + textLeft, TabRect.Top, TabRect.Width, TabRect.Height), ContentAlignment.MiddleLeft);
|
new Rectangle(TabRect.Left + textLeft, TabRect.Top, TabRect.Width, TabRect.Height), ContentAlignment.MiddleLeft);
|
||||||
|
|
||||||
var menuItem = Helper[index];
|
TabPage tabPage = TabPages[index];
|
||||||
bool show1 = TabPages[index].Text != MainPage;
|
UIPage uiPage = Helper.GetPage(tabPage);
|
||||||
bool show2 = menuItem == null || !menuItem.AlwaysOpen;
|
bool show1 = tabPage.Text != MainPage;
|
||||||
|
bool show2 = uiPage == null || !uiPage.AlwaysOpen;
|
||||||
bool showButton = show1 && show2;
|
bool showButton = show1 && show2;
|
||||||
|
|
||||||
if (showButton)
|
if (showButton)
|
||||||
@ -768,9 +755,10 @@ namespace Sunny.UI
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var menuItem = Helper[removeIndex];
|
TabPage tabPage = TabPages[removeIndex];
|
||||||
bool show1 = TabPages[removeIndex].Text != MainPage;
|
UIPage uiPage = Helper.GetPage(tabPage);
|
||||||
bool show2 = menuItem == null || !menuItem.AlwaysOpen;
|
bool show1 = tabPage.Text != MainPage;
|
||||||
|
bool show2 = uiPage == null || !uiPage.AlwaysOpen;
|
||||||
bool showButton = show1 && show2;
|
bool showButton = show1 && show2;
|
||||||
if (showButton)
|
if (showButton)
|
||||||
{
|
{
|
||||||
@ -802,20 +790,6 @@ namespace Sunny.UI
|
|||||||
|
|
||||||
public event OnAfterRemoveTabPage AfterRemoveTabPage;
|
public event OnAfterRemoveTabPage AfterRemoveTabPage;
|
||||||
|
|
||||||
[DefaultValue(true)]
|
|
||||||
[Description("多页面框架时,包含UIPage,在点击Tab页关闭时关闭UIPage"), Category("SunnyUI")]
|
|
||||||
public bool AutoClosePage
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
[DefaultValue(true)]
|
|
||||||
[Description("移除TabPage后,是否自动销毁TabPage"), Category("SunnyUI")]
|
|
||||||
public bool DisposeTabPageAfterRemove
|
|
||||||
{
|
|
||||||
get; set;
|
|
||||||
}
|
|
||||||
|
|
||||||
internal void RemoveTabPage(int index)
|
internal void RemoveTabPage(int index)
|
||||||
{
|
{
|
||||||
if (index < 0 || index >= TabCount)
|
if (index < 0 || index >= TabCount)
|
||||||
@ -824,44 +798,24 @@ namespace Sunny.UI
|
|||||||
}
|
}
|
||||||
|
|
||||||
TabPage tabPage = TabPages[index];
|
TabPage tabPage = TabPages[index];
|
||||||
var pages = tabPage.GetControls<UIPage>();
|
UIPage uiPage = Helper.GetPage(tabPage);
|
||||||
for (int i = 0; i < pages.Count; i++)
|
if (uiPage != null)
|
||||||
{
|
{
|
||||||
if (AutoClosePage)
|
PageRemoved?.Invoke(this, new UIPageEventArgs(uiPage));
|
||||||
{
|
Helper.RemovePage(uiPage);
|
||||||
PageRemoved?.Invoke(this, new UIPageEventArgs(pages[i]));
|
AfterRemoveTabPage?.Invoke(this, index);
|
||||||
|
}
|
||||||
try
|
else
|
||||||
{
|
{
|
||||||
pages[i].Final();
|
tabPage.Parent = null;
|
||||||
pages[i].Close();
|
tabPage.Dispose();
|
||||||
pages[i].Dispose();
|
tabPage = null;
|
||||||
pages[i] = null;
|
|
||||||
}
|
|
||||||
catch
|
|
||||||
{ }
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pages[i].Parent = null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TabCount > 1 && index > 0)
|
if (TabCount > 1 && index > 0)
|
||||||
{
|
{
|
||||||
SelectedTab = TabPages[index - 1];
|
SelectedTab = TabPages[index - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
TabPages.Remove(tabPage);
|
|
||||||
AfterRemoveTabPage?.Invoke(this, index);
|
|
||||||
|
|
||||||
//if (TabCount > 0)
|
|
||||||
//{
|
|
||||||
// if (index == 0) SelectedIndex = 0;
|
|
||||||
// if (index > 0) SelectedIndex = index - 1;
|
|
||||||
//}
|
|
||||||
|
|
||||||
if (DisposeTabPageAfterRemove) tabPage.Dispose();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum UITabPosition
|
public enum UITabPosition
|
||||||
@ -901,8 +855,6 @@ namespace Sunny.UI
|
|||||||
timer?.Start();
|
timer?.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
//private int LastIndex;
|
|
||||||
|
|
||||||
public void Init()
|
public void Init()
|
||||||
{
|
{
|
||||||
if (SelectedIndex < 0 || SelectedIndex >= TabPages.Count)
|
if (SelectedIndex < 0 || SelectedIndex >= TabPages.Count)
|
||||||
|
216
SunnyUI/Controls/UITabControlHelper.cs
Normal file
216
SunnyUI/Controls/UITabControlHelper.cs
Normal file
@ -0,0 +1,216 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Windows.Forms;
|
||||||
|
|
||||||
|
namespace Sunny.UI
|
||||||
|
{
|
||||||
|
public class UITabControlHelper
|
||||||
|
{
|
||||||
|
private readonly ConcurrentDictionary<TabPage, UIPage> PageItems = new();
|
||||||
|
|
||||||
|
private readonly UITabControl tabControl;
|
||||||
|
|
||||||
|
public UITabControlHelper(UITabControl ctrl)
|
||||||
|
{
|
||||||
|
tabControl = ctrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTipsText(int pageIndex, string tipsText)
|
||||||
|
{
|
||||||
|
TabPage tabPage = GetTabPage(pageIndex);
|
||||||
|
if (tabPage != null) tabControl.SetTipsText(tabPage, tipsText);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetTipsText(Guid pageGuid, string tipsText)
|
||||||
|
{
|
||||||
|
TabPage tabPage = GetTabPage(pageGuid);
|
||||||
|
if (tabPage != null) tabControl.SetTipsText(tabPage, tipsText);
|
||||||
|
}
|
||||||
|
|
||||||
|
public UIPage AddPage(UIPage uiPage)
|
||||||
|
{
|
||||||
|
if (uiPage == null) throw new ArgumentNullException("This UIPage can't be empty.");
|
||||||
|
|
||||||
|
if (uiPage.PageGuid == Guid.Empty && uiPage.PageIndex < 0)
|
||||||
|
{
|
||||||
|
uiPage.PageGuid = Guid.NewGuid();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PageItems != null && PageItems.Count > 0)
|
||||||
|
{
|
||||||
|
if (PageItems.Values.Where(p => p == uiPage).FirstOrDefault() != null)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("This UIPage is already exists.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uiPage.PageGuid != Guid.Empty)
|
||||||
|
{
|
||||||
|
if (GetPage(uiPage.PageGuid) != null)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("This UIPage is already exists.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (uiPage.PageIndex >= 0)
|
||||||
|
{
|
||||||
|
if (GetPage(uiPage.PageIndex) != null)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("This UIPage is already exists.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TabPage tabPage = CreateTabIfNotExists(uiPage);
|
||||||
|
uiPage.Dock = DockStyle.Fill;
|
||||||
|
uiPage.TabPage = tabPage;
|
||||||
|
tabPage.Controls.Add(uiPage);
|
||||||
|
tabPage.Text = uiPage.Text;
|
||||||
|
uiPage.Show();
|
||||||
|
|
||||||
|
return uiPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TabPage CreateTabIfNotExists(UIPage uiPage)
|
||||||
|
{
|
||||||
|
foreach (TabPage tabPage in tabControl.TabPages)
|
||||||
|
{
|
||||||
|
if (tabPage.Controls.Count == 0)
|
||||||
|
{
|
||||||
|
PageItems.TryAdd(tabPage, uiPage);
|
||||||
|
return tabPage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TabPage newPage = new TabPage();
|
||||||
|
newPage.SuspendLayout();
|
||||||
|
tabControl.Controls.Add(newPage);
|
||||||
|
PageItems.TryAdd(newPage, uiPage);
|
||||||
|
newPage.ResumeLayout();
|
||||||
|
return newPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
private TabPage GetTabPage(int pageIndex) => GetPage(pageIndex)?.TabPage;
|
||||||
|
|
||||||
|
private TabPage GetTabPage(Guid pageGuid) => GetPage(pageGuid)?.TabPage;
|
||||||
|
|
||||||
|
public event EventHandler<TabPageAndUIPageArgs> TabPageAndUIPageChanged;
|
||||||
|
|
||||||
|
public bool SelectPage(int pageIndex)
|
||||||
|
{
|
||||||
|
if (pageIndex < 0) return false;
|
||||||
|
|
||||||
|
if (PageItems.TryGetValue(tabControl.SelectedTab, out var fromPage))
|
||||||
|
{
|
||||||
|
bool isCancel = fromPage.OnPageDeselecting();
|
||||||
|
if (isCancel) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TabPage tabPage = GetTabPage(pageIndex);
|
||||||
|
if (tabPage != null && PageItems.TryGetValue(tabPage, out var toPage))
|
||||||
|
{
|
||||||
|
toPage.Translate();
|
||||||
|
tabControl.SelectTab(tabPage);
|
||||||
|
TabPageAndUIPageChanged?.Invoke(this, new TabPageAndUIPageArgs(tabPage, toPage));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool SelectPage(Guid pageGuid)
|
||||||
|
{
|
||||||
|
if (pageGuid == Guid.Empty) return false;
|
||||||
|
|
||||||
|
if (PageItems.TryGetValue(tabControl.SelectedTab, out var fromPage))
|
||||||
|
{
|
||||||
|
bool isCancel = fromPage.OnPageDeselecting();
|
||||||
|
if (isCancel) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
TabPage tabPage = GetTabPage(pageGuid);
|
||||||
|
if (tabPage != null && PageItems.TryGetValue(tabPage, out var toPage))
|
||||||
|
{
|
||||||
|
toPage.Translate();
|
||||||
|
tabControl.SelectTab(tabPage);
|
||||||
|
TabPageAndUIPageChanged?.Invoke(this, new TabPageAndUIPageArgs(tabPage, toPage));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UIPage GetPage(TabPage tabPage)
|
||||||
|
{
|
||||||
|
if (PageItems.TryGetValue(tabControl.SelectedTab, out var uiPage))
|
||||||
|
return uiPage;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public UIPage GetPage(int pageIndex) =>
|
||||||
|
PageItems.Values.Where(p => p.PageIndex == pageIndex).FirstOrDefault();
|
||||||
|
|
||||||
|
public UIPage GetPage(Guid pageGuid) =>
|
||||||
|
PageItems.Values.Where(p => p.PageGuid == pageGuid).FirstOrDefault();
|
||||||
|
|
||||||
|
public T GetPage<T>() where T : UIPage => GetPages<T>().FirstOrDefault();
|
||||||
|
|
||||||
|
public List<T> GetPages<T>() where T : UIPage
|
||||||
|
{
|
||||||
|
List<T> result = new List<T>();
|
||||||
|
foreach (var item in PageItems.Values)
|
||||||
|
{
|
||||||
|
if (item is T pg) result.Add(pg);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveAllPages(bool keepMainPage = true)
|
||||||
|
{
|
||||||
|
var pages = PageItems.Values;
|
||||||
|
foreach (var page in pages)
|
||||||
|
{
|
||||||
|
if (keepMainPage && page.TabPage?.Text == tabControl.MainPage) continue;
|
||||||
|
RemovePage(page);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool RemovePage(UIPage uiPage)
|
||||||
|
{
|
||||||
|
if (uiPage == null) return false;
|
||||||
|
TabPage tabPage = uiPage.TabPage;
|
||||||
|
PageItems.TryRemove(tabPage, out _);
|
||||||
|
if (tabPage != null)
|
||||||
|
{
|
||||||
|
tabPage.Parent = null;
|
||||||
|
tabPage.Dispose();
|
||||||
|
tabPage = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
uiPage.Final();
|
||||||
|
uiPage.Close();
|
||||||
|
uiPage.Dispose();
|
||||||
|
uiPage = null;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool RemovePage(int pageIndex) => RemovePage(GetPage(pageIndex));
|
||||||
|
|
||||||
|
public bool RemovePage(Guid pageGuid) => RemovePage(GetPage(pageGuid));
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TabPageAndUIPageArgs : EventArgs
|
||||||
|
{
|
||||||
|
public TabPage TabPage { get; set; }
|
||||||
|
|
||||||
|
public UIPage UIPage { get; set; }
|
||||||
|
|
||||||
|
public TabPageAndUIPageArgs(TabPage tabPage, UIPage uiPage)
|
||||||
|
{
|
||||||
|
TabPage = tabPage;
|
||||||
|
UIPage = uiPage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -625,7 +625,7 @@ namespace Sunny.UI
|
|||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
bool ReturnFlag = false;
|
bool ReturnFlag = DesignMode;
|
||||||
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
|
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
|
||||||
ReturnFlag = true;
|
ReturnFlag = true;
|
||||||
else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")
|
else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")
|
||||||
@ -872,8 +872,7 @@ namespace Sunny.UI
|
|||||||
|
|
||||||
private void MainTabControl_TabPageAndUIPageChanged(object sender, TabPageAndUIPageArgs e)
|
private void MainTabControl_TabPageAndUIPageChanged(object sender, TabPageAndUIPageArgs e)
|
||||||
{
|
{
|
||||||
List<UIPage> pages = e.TabPage.GetControls<UIPage>();
|
SelectedPage = e.UIPage;
|
||||||
SelectedPage = pages.Count == 1 ? pages[0] : null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void MainTabControl_Deselected(object sender, TabControlEventArgs e)
|
private void MainTabControl_Deselected(object sender, TabControlEventArgs e)
|
||||||
@ -921,6 +920,11 @@ namespace Sunny.UI
|
|||||||
{
|
{
|
||||||
SetDefaultTabControl();
|
SetDefaultTabControl();
|
||||||
|
|
||||||
|
if (page == null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(page));
|
||||||
|
}
|
||||||
|
|
||||||
if (MainTabControl == null)
|
if (MainTabControl == null)
|
||||||
{
|
{
|
||||||
throw (new ApplicationException("未指定MainTabControl,无法承载多页面。"));
|
throw (new ApplicationException("未指定MainTabControl,无法承载多页面。"));
|
||||||
@ -1072,6 +1076,8 @@ namespace Sunny.UI
|
|||||||
}
|
}
|
||||||
|
|
||||||
SelectedPage?.Translate();
|
SelectedPage?.Translate();
|
||||||
|
|
||||||
|
if (IsDesignMode) return;
|
||||||
this.TranslateOther();
|
this.TranslateOther();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,14 +41,6 @@ namespace Sunny.UI
|
|||||||
MainContainer.AfterRemoveTabPage += MainContainer_AfterRemoveTabPage;
|
MainContainer.AfterRemoveTabPage += MainContainer_AfterRemoveTabPage;
|
||||||
}
|
}
|
||||||
|
|
||||||
[DefaultValue(false)]
|
|
||||||
[Description("多页面框架时,包含UIPage,在点击Tab页关闭时关闭UIPage"), Category("SunnyUI")]
|
|
||||||
public bool AutoClosePage
|
|
||||||
{
|
|
||||||
get => MainContainer.AutoClosePage;
|
|
||||||
set => MainContainer.AutoClosePage = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void MainContainer_AfterRemoveTabPage(object sender, int index)
|
private void MainContainer_AfterRemoveTabPage(object sender, int index)
|
||||||
{
|
{
|
||||||
AfterRemoveTabPage?.Invoke(this, index);
|
AfterRemoveTabPage?.Invoke(this, index);
|
||||||
|
@ -1124,6 +1124,20 @@ namespace Sunny.UI
|
|||||||
ReceiveParams?.Invoke(this, e);
|
ReceiveParams?.Invoke(this, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected bool IsDesignMode
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
bool ReturnFlag = DesignMode;
|
||||||
|
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
|
||||||
|
ReturnFlag = true;
|
||||||
|
else if (System.Diagnostics.Process.GetCurrentProcess().ProcessName == "devenv")
|
||||||
|
ReturnFlag = true;
|
||||||
|
|
||||||
|
return ReturnFlag;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public virtual void Translate()
|
public virtual void Translate()
|
||||||
{
|
{
|
||||||
var controls = this.GetInterfaceControls<ITranslate>(true);
|
var controls = this.GetInterfaceControls<ITranslate>(true);
|
||||||
@ -1132,6 +1146,7 @@ namespace Sunny.UI
|
|||||||
control.Translate();
|
control.Translate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (IsDesignMode) return;
|
||||||
this.TranslateOther();
|
this.TranslateOther();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user