using System.Windows; using System.Windows.Controls; using System.Windows.Media; namespace SchedulingSystemClient.UserControls { /// /// UC_TabItemWithClose.xaml 的交互逻辑 /// public partial class UC_TabItemWithClose : TabItem { public UC_TabItemWithClose() { InitializeComponent(); } #region 成员变量 /// /// 父级TabControl /// private TabControl m_Parent; /// /// 约定的宽度 /// private double m_ConventionWidth = 100; #endregion private void TabItem_Loaded(object sender, RoutedEventArgs e) { //找到父级TabControl m_Parent = FindParentTabControl(this); if (m_Parent != null) Load(); } public void btn_Close_Click(object sender, RoutedEventArgs e) { if (m_Parent == null) return; //移除自身 m_Parent.Items.Remove(this); //移除事件 m_Parent.SizeChanged -= m_Parent_SizeChanged; //调整剩余项大小 //保持约定宽度item的临界个数 int criticalCount = (int)((m_Parent.ActualWidth - 5) / m_ConventionWidth); //平均宽度 double perWidth = (m_Parent.ActualWidth - 5) / m_Parent.Items.Count; foreach (UC_TabItemWithClose item in m_Parent.Items) { if (m_Parent.Items.Count <= criticalCount) { item.Width = m_ConventionWidth; } else { item.Width = perWidth; } } } #region 父级TabControl尺寸发生变化 /// /// 父级TabControl尺寸发生变化 /// private void m_Parent_SizeChanged(object sender, SizeChangedEventArgs e) { //调整自身大小 //保持约定宽度item的临界个数 int criticalCount = (int)((m_Parent.ActualWidth - 5) / m_ConventionWidth); if (m_Parent.Items.Count <= criticalCount) { //小于等于临界个数 等于约定宽度 this.Width = m_ConventionWidth; } else { //大于临界个数 等于平均宽度 double perWidth = (m_Parent.ActualWidth - 5) / m_Parent.Items.Count; this.Width = perWidth; } } #endregion #region 方法 #region Load /// /// Load /// private void Load() { //约定的宽度 double.TryParse(m_Parent.Tag.ToString(), out m_ConventionWidth); //注册父级TabControl尺寸发生变化事件 m_Parent.SizeChanged += m_Parent_SizeChanged; //自适应 //保持约定宽度item的临界个数 int criticalCount = (int)((m_Parent.ActualWidth - 5) / m_ConventionWidth); if (m_Parent.Items.Count <= criticalCount) { //小于等于临界个数 等于约定宽度 this.Width = m_ConventionWidth; } else { //大于临界个数 每项都设成平均宽度 double perWidth = (m_Parent.ActualWidth - 5) / m_Parent.Items.Count; foreach (UC_TabItemWithClose item in m_Parent.Items) { item.Width = perWidth; } this.Width = perWidth; } } #endregion #region 递归找父级TabControl /// /// 递归找父级TabControl /// /// 依赖对象 /// TabControl private TabControl FindParentTabControl(DependencyObject reference) { DependencyObject dObj = VisualTreeHelper.GetParent(reference); if (dObj == null) return null; if (dObj.GetType() == typeof(TabControl)) return dObj as TabControl; else return FindParentTabControl(dObj); } #endregion #endregion } }