using System; using System.Collections.ObjectModel; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace SourceGit.Views.Widgets { /// /// 主窗体标题栏的标签页容器控件 /// public partial class PageTabBar : UserControl { /// /// 标签数据 /// public class Tab { public string Id { get; set; } public UserControl Control { get; set; } public Tab(string id, UserControl ctrl) { Id = id; Control = ctrl; } } /// /// 标签相关事件参数 /// public class TabEventArgs : RoutedEventArgs { public string TabId { get; set; } public TabEventArgs(RoutedEvent e, object o, string id) : base(e, o) { TabId = id; } } public static readonly RoutedEvent TabAddEvent = EventManager.RegisterRoutedEvent( "TabAdd", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(PageTabBar)); public event RoutedEventHandler TabAdd { add { AddHandler(TabAddEvent, value); } remove { RemoveHandler(TabAddEvent, value); } } public static readonly RoutedEvent TabSelectedEvent = EventManager.RegisterRoutedEvent( "TabSelected", RoutingStrategy.Bubble, typeof(EventHandler), typeof(PageTabBar)); public event RoutedEventHandler TabSelected { add { AddHandler(TabSelectedEvent, value); } remove { RemoveHandler(TabSelectedEvent, value); } } public static readonly RoutedEvent TabClosedEvent = EventManager.RegisterRoutedEvent( "TabClosed", RoutingStrategy.Bubble, typeof(EventHandler), typeof(PageTabBar)); public event RoutedEventHandler TabClosed { add { AddHandler(TabClosedEvent, value); } remove { RemoveHandler(TabClosedEvent, value); } } public ObservableCollection Tabs { get; private set; } public string Current { get { return (container.SelectedItem as Tab).Id; } } public PageTabBar() { Tabs = new ObservableCollection(); InitializeComponent(); } public void Add(string id, UserControl element) { var tab = new Tab(id, element); Tabs.Add(tab); container.SelectedItem = tab; } public void Replace(string oldId, string newId, UserControl element) { var tab = null as Tab; var curTab = container.SelectedItem as Tab; foreach (var one in Tabs) { if (one.Id == oldId) { tab = one; break; } } if (tab == null) return; var idx = Tabs.IndexOf(tab); Tabs.RemoveAt(idx); RaiseEvent(new TabEventArgs(TabClosedEvent, this, tab.Id)); var replaced = new Tab(newId, element); Tabs.Insert(idx, replaced); if (curTab.Id == oldId) container.SelectedItem = replaced; } public bool Goto(string id) { foreach (var tab in Tabs) { if (tab.Id == id) { container.SelectedItem = tab; return true; } } return false; } private void CalcScrollerVisibilty(object sender, SizeChangedEventArgs e) { if ((sender as StackPanel).ActualWidth > scroller.ActualWidth) { leftScroller.Visibility = Visibility.Visible; rightScroller.Visibility = Visibility.Visible; } else { leftScroller.Visibility = Visibility.Collapsed; rightScroller.Visibility = Visibility.Collapsed; } } private void NewTab(object sender, RoutedEventArgs e) { RaiseEvent(new RoutedEventArgs(TabAddEvent)); } private void ScrollLeft(object sender, RoutedEventArgs e) { scroller.LineLeft(); } private void ScrollRight(object sender, RoutedEventArgs e) { scroller.LineRight(); } private void SelectionChanged(object sender, SelectionChangedEventArgs e) { var tab = container.SelectedItem as Tab; if (tab == null) return; RaiseEvent(new TabEventArgs(TabSelectedEvent, this, tab.Id)); } private void CloseTab(object sender, RoutedEventArgs e) { var btn = (sender as Button); var tab = btn.DataContext as Tab; if (tab == null) return; var curTab = container.SelectedItem as Tab; if (curTab != null && tab.Id == curTab.Id) { if (Tabs.Count > 1) { var idx = Tabs.IndexOf(tab); Tabs.Remove(tab); var next = Tabs[idx % Tabs.Count]; container.SelectedItem = next; RaiseEvent(new TabEventArgs(TabSelectedEvent, this, next.Id)); } else { Application.Current.Shutdown(); } } else { Tabs.Remove(tab); } RaiseEvent(new TabEventArgs(TabClosedEvent, this, tab.Id)); } private void OnMouseMove(object sender, MouseEventArgs e) { var item = sender as ListBoxItem; if (item == null) return; if (Mouse.LeftButton == MouseButtonState.Pressed) { var dragging = new Controls.DragDropAdorner(item); DragDrop.DoDragDrop(item, item.DataContext, DragDropEffects.Move); dragging.Remove(); } } private void OnDrop(object sender, DragEventArgs e) { var tabSrc = e.Data.GetData(typeof(Tab)) as Tab; if (tabSrc == null) return; var dst = e.Source as FrameworkElement; if (dst == null) return; var tabDst = dst.DataContext as Tab; if (tabSrc.Id == tabDst.Id) return; int dstIdx = Tabs.IndexOf(tabDst); Tabs.Remove(tabSrc); Tabs.Insert(dstIdx, tabSrc); container.SelectedItem = tabSrc; e.Handled = true; } } }