private static void ScrollTabItemToVisible(TabControl tabControl) { TabIndexRange range = new TabIndexRange(tabControl); if (range.PartialMin == -1 || range.PartialMax == -1) { return; } int index = tabControl.SelectedIndex; if (range.FullMin <= index && index <= range.FullMax) { return; } if (index <= range.PartialMin) { ScrollTabItemAsLeft(tabControl, range.Viewer, range.Panel, index); return; } if (range.PartialMax <= index) { ScrollTabItemAsRight(tabControl, range.Viewer, range.Panel, index); } return; }
private void buttonScrollRight_Click(object sender, RoutedEventArgs e) { Button btn = (sender as Button); TabControl tab = btn.TemplatedParent as TabControl; TabIndexRange range = new TabIndexRange(tab); ScrollTabItemAsLeft(tab, range.Viewer, range.Panel, range.FullMax); TabIndexRange range2 = new TabIndexRange(tab); if (range.FullMax < tab.Items.Count - 1 && range.FullMax == range2.FullMax) { ScrollTabItemAsLeft(tab, range.Viewer, range.Panel, range.FullMax + 1); } }
private void buttonScrollLeft_Click(object sender, RoutedEventArgs e) { Button btn = (sender as Button); TabControl tab = btn.TemplatedParent as TabControl; TabIndexRange range = new TabIndexRange(tab); ScrollTabItemAsRight(tab, range.Viewer, range.Panel, range.FullMin); TabIndexRange range2 = new TabIndexRange(tab); if (0 < range.FullMin && range.FullMin == range2.FullMin) { ScrollTabItemAsRight(tab, range.Viewer, range.Panel, range.FullMin - 1); } }
private void tabPanelScrollViewer_MouseMove(object sender, MouseEventArgs e) { if (MovingTabItem == null) { return; } ScrollViewer viewer = sender as ScrollViewer; if (viewer == null) { return; } if (e.MouseDevice.LeftButton == MouseButtonState.Pressed && !viewer.IsMouseCaptured) { viewer.CaptureMouse(); } FrameworkElement parent = VisualTreeHelper.GetParent(viewer) as FrameworkElement; Point p = e.MouseDevice.GetPosition(parent); double dx = 0; if (p.X < 0) { dx = p.X; } else if (viewer.ActualWidth < p.X) { dx = p.X - viewer.ActualWidth; } TabControl tab = MovingTabItem.Parent as TabControl; MovableTabItem goal; if (dx == 0) { HitTestResult ret = VisualTreeHelper.HitTest(viewer, e.MouseDevice.GetPosition(viewer)); if (ret == null) { return; } goal = App.FindVisualParent <MovableTabItem>(ret.VisualHit); double x = e.MouseDevice.GetPosition(goal).X; if (x < 0 || MovingTabItem.ActualWidth < x) { // 移動した結果マウスの位置が選択しているタブの範囲外になって振動を起こさないように goal = null; } } else if (dx < 0) { TabIndexRange range = new TabIndexRange(tab); goal = tab.Items[Math.Max(0, range.PartialMin - 1)] as MovableTabItem; } else { TabIndexRange range = new TabIndexRange(tab); goal = tab.Items[Math.Min(range.PartialMax + 1, tab.Items.Count - 1)] as MovableTabItem; } if (goal == null || goal.Parent != MovingTabItem.Parent) { return; } MoveTabItem(goal); }