5 files changed
+225
-88
No files matched your search
@@ -7,7 +7,7 @@
|
|||||||
<controls:ScrollViewer HorizontalScrollBarVisibility="Auto">
|
<controls:ScrollViewer HorizontalScrollBarVisibility="Auto">
|
||||||
<StackPanel>
|
<StackPanel>
|
||||||
<Label Style="{StaticResource LabelPrimary}" Content="Default" Margin="32,32,0,0" HorizontalAlignment="Left"/>
|
<Label Style="{StaticResource LabelPrimary}" Content="Default" Margin="32,32,0,0" HorizontalAlignment="Left"/>
|
||||||
<controls:TabControl Margin="32,16,32,0" Width="800" Height="300">
|
<controls:TabControl Margin="32,16,32,0" Width="800" Height="300" IsScrollable="True">
|
||||||
<controls:TabItem Header="TabItem1">
|
<controls:TabItem Header="TabItem1">
|
||||||
<controls:SimplePanel Background="White"/>
|
<controls:SimplePanel Background="White"/>
|
||||||
</controls:TabItem>
|
</controls:TabItem>
|
||||||
|
|||||||
@@ -114,7 +114,8 @@ namespace HandyControl.Controls
|
|||||||
_isRunning = false;
|
_isRunning = false;
|
||||||
};
|
};
|
||||||
_isRunning = true;
|
_isRunning = true;
|
||||||
BeginAnimation(CurrentVerticalOffsetProperty, animation);
|
|
||||||
|
BeginAnimation(CurrentVerticalOffsetProperty, animation, HandoffBehavior.Compose);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void ScrollToHorizontalOffsetInternal(double offset, double milliseconds = 500)
|
internal void ScrollToHorizontalOffsetInternal(double offset, double milliseconds = 500)
|
||||||
@@ -131,7 +132,8 @@ namespace HandyControl.Controls
|
|||||||
_isRunning = false;
|
_isRunning = false;
|
||||||
};
|
};
|
||||||
_isRunning = true;
|
_isRunning = true;
|
||||||
BeginAnimation(CurrentHorizontalOffsetProperty, animation);
|
|
||||||
|
BeginAnimation(CurrentHorizontalOffsetProperty, animation, HandoffBehavior.Compose);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters) =>
|
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters) =>
|
||||||
@@ -150,7 +152,7 @@ namespace HandyControl.Controls
|
|||||||
|
|
||||||
public static bool GetIsEnableInertia(DependencyObject element)
|
public static bool GetIsEnableInertia(DependencyObject element)
|
||||||
{
|
{
|
||||||
return (bool) element.GetValue(IsEnableInertiaProperty);
|
return (bool)element.GetValue(IsEnableInertiaProperty);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -158,7 +160,7 @@ namespace HandyControl.Controls
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsEnableInertia
|
public bool IsEnableInertia
|
||||||
{
|
{
|
||||||
get => (bool)GetValue(IsEnableInertiaProperty);
|
get => (bool) GetValue(IsEnableInertiaProperty);
|
||||||
set => SetValue(IsEnableInertiaProperty, value);
|
set => SetValue(IsEnableInertiaProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,7 +175,7 @@ namespace HandyControl.Controls
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsPenetrating
|
public bool IsPenetrating
|
||||||
{
|
{
|
||||||
get => (bool)GetValue(IsPenetratingProperty);
|
get => (bool) GetValue(IsPenetratingProperty);
|
||||||
set => SetValue(IsPenetratingProperty, value);
|
set => SetValue(IsPenetratingProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.Collections.Specialized;
|
|||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Controls.Primitives;
|
using System.Windows.Controls.Primitives;
|
||||||
|
using System.Windows.Input;
|
||||||
using HandyControl.Data;
|
using HandyControl.Data;
|
||||||
using HandyControl.Tools.Extension;
|
using HandyControl.Tools.Extension;
|
||||||
|
|
||||||
@@ -10,16 +11,31 @@ namespace HandyControl.Controls
|
|||||||
{
|
{
|
||||||
[TemplatePart(Name = OverflowButtonKey, Type = typeof(ContextMenuToggleButton))]
|
[TemplatePart(Name = OverflowButtonKey, Type = typeof(ContextMenuToggleButton))]
|
||||||
[TemplatePart(Name = HeaderPanelKey, Type = typeof(TabPanel))]
|
[TemplatePart(Name = HeaderPanelKey, Type = typeof(TabPanel))]
|
||||||
|
[TemplatePart(Name = OverflowScrollviewer, Type = typeof(ScrollViewer))]
|
||||||
|
[TemplatePart(Name = ScrollButtonLeft, Type = typeof(Button))]
|
||||||
|
[TemplatePart(Name = ScrollButtonRight, Type = typeof(Button))]
|
||||||
public class TabControl : System.Windows.Controls.TabControl
|
public class TabControl : System.Windows.Controls.TabControl
|
||||||
{
|
{
|
||||||
private const string OverflowButtonKey = "PART_OverflowButton";
|
private const string OverflowButtonKey = "PART_OverflowButton";
|
||||||
|
|
||||||
private const string HeaderPanelKey = "PART_HeaderPanel";
|
private const string HeaderPanelKey = "PART_HeaderPanel";
|
||||||
|
|
||||||
|
private const string OverflowScrollviewer = "PART_OverflowScrollviewer";
|
||||||
|
|
||||||
|
private const string ScrollButtonLeft = "PART_ScrollButtonLeft";
|
||||||
|
|
||||||
|
private const string ScrollButtonRight = "PART_ScrollButtonRight";
|
||||||
|
|
||||||
private ContextMenuToggleButton _buttonOverflow;
|
private ContextMenuToggleButton _buttonOverflow;
|
||||||
|
|
||||||
private TabPanel _headerPanel;
|
private TabPanel _headerPanel;
|
||||||
|
|
||||||
|
private ScrollViewer _scrollviewerOverflow;
|
||||||
|
|
||||||
|
private Button _buttonScrollLeft;
|
||||||
|
|
||||||
|
private Button _buttonScrollRight;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否为内部操作
|
/// 是否为内部操作
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -115,6 +131,21 @@ namespace HandyControl.Controls
|
|||||||
set => SetValue(TabItemHeightProperty, value);
|
set => SetValue(TabItemHeightProperty, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否可以滚动
|
||||||
|
/// </summary>
|
||||||
|
public static readonly DependencyProperty IsScrollableProperty = DependencyProperty.Register(
|
||||||
|
"IsScrollable", typeof(bool), typeof(TabControl), new PropertyMetadata(ValueBoxes.FalseBox));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否可以滚动
|
||||||
|
/// </summary>
|
||||||
|
public bool IsScrollable
|
||||||
|
{
|
||||||
|
get => (bool) GetValue(IsScrollableProperty);
|
||||||
|
set => SetValue(IsScrollableProperty, value);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 可见的标签数量
|
/// 可见的标签数量
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -133,7 +164,7 @@ namespace HandyControl.Controls
|
|||||||
if (!IsEnableTabFill)
|
if (!IsEnableTabFill)
|
||||||
{
|
{
|
||||||
_itemShowCount = (int)(ActualWidth / TabItemWidth);
|
_itemShowCount = (int)(ActualWidth / TabItemWidth);
|
||||||
_buttonOverflow.Show(Items.Count > 0 && Items.Count >= _itemShowCount);
|
_buttonOverflow.Show(Items.Count > 0 && Items.Count >= _itemShowCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IsInternalAction)
|
if (IsInternalAction)
|
||||||
@@ -163,12 +194,33 @@ namespace HandyControl.Controls
|
|||||||
|
|
||||||
public override void OnApplyTemplate()
|
public override void OnApplyTemplate()
|
||||||
{
|
{
|
||||||
|
if (_buttonOverflow != null)
|
||||||
|
{
|
||||||
|
if (_buttonOverflow.Menu != null)
|
||||||
|
{
|
||||||
|
_buttonOverflow.Menu.Closed -= Menu_Closed;
|
||||||
|
_buttonOverflow.Menu = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
_buttonOverflow.Click -= ButtonOverflow_Click;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_buttonScrollLeft != null) _buttonScrollLeft.Click -= ButtonScrollLeft_Click;
|
||||||
|
if (_buttonScrollRight != null) _buttonScrollRight.Click -= ButtonScrollRight_Click;
|
||||||
|
|
||||||
base.OnApplyTemplate();
|
base.OnApplyTemplate();
|
||||||
_headerPanel = Template.FindName(HeaderPanelKey, this) as TabPanel;
|
_headerPanel = Template.FindName(HeaderPanelKey, this) as TabPanel;
|
||||||
|
|
||||||
if (IsEnableTabFill) return;
|
if (IsEnableTabFill) return;
|
||||||
|
|
||||||
_buttonOverflow = Template.FindName(OverflowButtonKey, this) as ContextMenuToggleButton;
|
_buttonOverflow = Template.FindName(OverflowButtonKey, this) as ContextMenuToggleButton;
|
||||||
|
_scrollviewerOverflow = Template.FindName(OverflowScrollviewer, this) as ScrollViewer;
|
||||||
|
_buttonScrollLeft = Template.FindName(ScrollButtonLeft, this) as Button;
|
||||||
|
_buttonScrollRight = Template.FindName(ScrollButtonRight, this) as Button;
|
||||||
|
|
||||||
|
if (_buttonScrollLeft != null) _buttonScrollLeft.Click += ButtonScrollLeft_Click;
|
||||||
|
if (_buttonScrollRight != null) _buttonScrollRight.Click += ButtonScrollRight_Click;
|
||||||
|
|
||||||
if (_buttonOverflow != null)
|
if (_buttonOverflow != null)
|
||||||
{
|
{
|
||||||
_itemShowCount = (int)(ActualWidth / TabItemWidth);
|
_itemShowCount = (int)(ActualWidth / TabItemWidth);
|
||||||
@@ -179,49 +231,68 @@ namespace HandyControl.Controls
|
|||||||
Placement = PlacementMode.Bottom,
|
Placement = PlacementMode.Bottom,
|
||||||
PlacementTarget = _buttonOverflow
|
PlacementTarget = _buttonOverflow
|
||||||
};
|
};
|
||||||
menu.Closed += (s, e) => _buttonOverflow.IsChecked = false;
|
menu.Closed += Menu_Closed;
|
||||||
_buttonOverflow.Menu = menu;
|
_buttonOverflow.Menu = menu;
|
||||||
_buttonOverflow.Click += (s, e) =>
|
_buttonOverflow.Click += ButtonOverflow_Click;
|
||||||
{
|
|
||||||
if (_buttonOverflow.IsChecked == true)
|
|
||||||
{
|
|
||||||
_buttonOverflow.Menu.Items.Clear();
|
|
||||||
foreach (TabItem item in Items)
|
|
||||||
{
|
|
||||||
var menuItem = new MenuItem
|
|
||||||
{
|
|
||||||
Header = item.Header,
|
|
||||||
Width = TabItemWidth,
|
|
||||||
IsChecked = item.IsSelected,
|
|
||||||
IsCheckable = true
|
|
||||||
};
|
|
||||||
menuItem.Click += delegate
|
|
||||||
{
|
|
||||||
_buttonOverflow.IsChecked = false;
|
|
||||||
var index = Items.IndexOf(item);
|
|
||||||
if (index >= _itemShowCount)
|
|
||||||
{
|
|
||||||
Items.Remove(item);
|
|
||||||
Items.Insert(0, item);
|
|
||||||
if (IsEnableAnimation)
|
|
||||||
{
|
|
||||||
_headerPanel.ClearValue(TabPanel.FluidMoveDurationProperty);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_headerPanel.FluidMoveDuration = new Duration(TimeSpan.FromSeconds(0));
|
|
||||||
}
|
|
||||||
_headerPanel.ForceUpdate = true;
|
|
||||||
_headerPanel.Measure(new Size(_headerPanel.DesiredSize.Width, ActualHeight));
|
|
||||||
_headerPanel.ForceUpdate = false;
|
|
||||||
}
|
|
||||||
item.IsSelected = true;
|
|
||||||
};
|
|
||||||
_buttonOverflow.Menu.Items.Add(menuItem);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void Menu_Closed(object sender, RoutedEventArgs e) => _buttonOverflow.IsChecked = false;
|
||||||
|
|
||||||
|
private void ButtonScrollRight_Click(object sender, RoutedEventArgs e) =>
|
||||||
|
_scrollviewerOverflow.ScrollToHorizontalOffsetInternal(Math.Min(
|
||||||
|
_scrollviewerOverflow.CurrentHorizontalOffset + TabItemWidth, _scrollviewerOverflow.ScrollableWidth));
|
||||||
|
|
||||||
|
private void ButtonScrollLeft_Click(object sender, RoutedEventArgs e) =>
|
||||||
|
_scrollviewerOverflow.ScrollToHorizontalOffsetInternal(Math.Max(
|
||||||
|
_scrollviewerOverflow.CurrentHorizontalOffset - TabItemWidth, 0));
|
||||||
|
|
||||||
|
private void ButtonOverflow_Click(object sender, RoutedEventArgs e)
|
||||||
|
{
|
||||||
|
if (_buttonOverflow.IsChecked == true)
|
||||||
|
{
|
||||||
|
_buttonOverflow.Menu.Items.Clear();
|
||||||
|
foreach (TabItem item in Items)
|
||||||
|
{
|
||||||
|
var menuItem = new MenuItem
|
||||||
|
{
|
||||||
|
Header = item.Header,
|
||||||
|
Width = TabItemWidth,
|
||||||
|
IsChecked = item.IsSelected,
|
||||||
|
IsCheckable = true
|
||||||
|
};
|
||||||
|
menuItem.Click += delegate
|
||||||
|
{
|
||||||
|
_buttonOverflow.IsChecked = false;
|
||||||
|
var index = Items.IndexOf(item);
|
||||||
|
if (index >= _itemShowCount)
|
||||||
|
{
|
||||||
|
Items.Remove(item);
|
||||||
|
Items.Insert(0, item);
|
||||||
|
if (IsEnableAnimation)
|
||||||
|
{
|
||||||
|
_headerPanel.ClearValue(TabPanel.FluidMoveDurationProperty);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_headerPanel.FluidMoveDuration = new Duration(TimeSpan.FromSeconds(0));
|
||||||
|
}
|
||||||
|
_headerPanel.ForceUpdate = true;
|
||||||
|
_headerPanel.Measure(new Size(_headerPanel.DesiredSize.Width, ActualHeight));
|
||||||
|
_headerPanel.ForceUpdate = false;
|
||||||
|
}
|
||||||
|
item.IsSelected = true;
|
||||||
|
};
|
||||||
|
_buttonOverflow.Menu.Items.Add(menuItem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal double GetHorizontalOffset() => _scrollviewerOverflow?.CurrentHorizontalOffset ?? 0;
|
||||||
|
|
||||||
|
internal void UpdateScroll() => _scrollviewerOverflow?.RaiseEvent(new MouseWheelEventArgs(Mouse.PrimaryDevice, Environment.TickCount, 0)
|
||||||
|
{
|
||||||
|
RoutedEvent = MouseWheelEvent
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -87,6 +87,11 @@ namespace HandyControl.Controls
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private int _currentIndex;
|
private int _currentIndex;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 标签容器横向滚动距离
|
||||||
|
/// </summary>
|
||||||
|
private double _scrollHorizontalOffset;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 标签容器
|
/// 标签容器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -178,17 +183,21 @@ namespace HandyControl.Controls
|
|||||||
base.OnMouseLeftButtonDown(e);
|
base.OnMouseLeftButtonDown(e);
|
||||||
if (TabControlParent.IsDraggable && !ItemIsDragging && !_isDragging)
|
if (TabControlParent.IsDraggable && !ItemIsDragging && !_isDragging)
|
||||||
{
|
{
|
||||||
|
TabControlParent.UpdateScroll();
|
||||||
TabPanel.FluidMoveDuration = new Duration(TimeSpan.FromSeconds(0));
|
TabPanel.FluidMoveDuration = new Duration(TimeSpan.FromSeconds(0));
|
||||||
_mouseDownOffsetX = RenderTransform.Value.OffsetX;
|
_mouseDownOffsetX = RenderTransform.Value.OffsetX;
|
||||||
var mx = TranslatePoint(new Point(), TabControlParent).X;
|
_scrollHorizontalOffset = TabControlParent.GetHorizontalOffset();
|
||||||
|
var mx = TranslatePoint(new Point(), TabControlParent).X + _scrollHorizontalOffset;
|
||||||
_mouseDownIndex = CalLocationIndex(mx);
|
_mouseDownIndex = CalLocationIndex(mx);
|
||||||
_maxMoveLeft = -_mouseDownIndex * ItemWidth;
|
var subIndex = _mouseDownIndex - CalLocationIndex(_scrollHorizontalOffset);
|
||||||
|
_maxMoveLeft = -subIndex * ItemWidth;
|
||||||
_maxMoveRight = TabControlParent.ActualWidth - ActualWidth + _maxMoveLeft;
|
_maxMoveRight = TabControlParent.ActualWidth - ActualWidth + _maxMoveLeft;
|
||||||
|
|
||||||
_isDragging = true;
|
_isDragging = true;
|
||||||
ItemIsDragging = true;
|
ItemIsDragging = true;
|
||||||
_isWaiting = true;
|
_isWaiting = true;
|
||||||
_dragPoint = e.GetPosition(TabControlParent);
|
_dragPoint = e.GetPosition(TabControlParent);
|
||||||
|
_dragPoint = new Point(_dragPoint.X + +_scrollHorizontalOffset, _dragPoint.Y);
|
||||||
_mouseDownPoint = _dragPoint;
|
_mouseDownPoint = _dragPoint;
|
||||||
CaptureMouse();
|
CaptureMouse();
|
||||||
}
|
}
|
||||||
@@ -199,9 +208,10 @@ namespace HandyControl.Controls
|
|||||||
base.OnMouseMove(e);
|
base.OnMouseMove(e);
|
||||||
if (ItemIsDragging && _isDragging)
|
if (ItemIsDragging && _isDragging)
|
||||||
{
|
{
|
||||||
var subX = TranslatePoint(new Point(), TabControlParent).X;
|
var subX = TranslatePoint(new Point(), TabControlParent).X + _scrollHorizontalOffset;
|
||||||
CurrentIndex = CalLocationIndex(subX);
|
CurrentIndex = CalLocationIndex(subX);
|
||||||
var p = e.GetPosition(TabControlParent);
|
var p = e.GetPosition(TabControlParent);
|
||||||
|
p = new Point(p.X + _scrollHorizontalOffset, p.Y);
|
||||||
var subLeft = p.X - _dragPoint.X;
|
var subLeft = p.X - _dragPoint.X;
|
||||||
var totalLeft = p.X - _mouseDownPoint.X;
|
var totalLeft = p.X - _mouseDownPoint.X;
|
||||||
|
|
||||||
@@ -229,7 +239,7 @@ namespace HandyControl.Controls
|
|||||||
ReleaseMouseCapture();
|
ReleaseMouseCapture();
|
||||||
if (_isDragged)
|
if (_isDragged)
|
||||||
{
|
{
|
||||||
var subX = TranslatePoint(new Point(), TabControlParent).X;
|
var subX = TranslatePoint(new Point(), TabControlParent).X + _scrollHorizontalOffset;
|
||||||
var index = CalLocationIndex(subX);
|
var index = CalLocationIndex(subX);
|
||||||
var left = index * ItemWidth;
|
var left = index * ItemWidth;
|
||||||
var offsetX = RenderTransform.Value.OffsetX;
|
var offsetX = RenderTransform.Value.OffsetX;
|
||||||
@@ -273,7 +283,7 @@ namespace HandyControl.Controls
|
|||||||
animation.Completed += (s1, e1) => AnimationCompleted();
|
animation.Completed += (s1, e1) => AnimationCompleted();
|
||||||
var f = new TranslateTransform(offsetX, 0);
|
var f = new TranslateTransform(offsetX, 0);
|
||||||
RenderTransform = f;
|
RenderTransform = f;
|
||||||
f.BeginAnimation(TranslateTransform.XProperty, animation);
|
f.BeginAnimation(TranslateTransform.XProperty, animation, HandoffBehavior.Compose);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -71,6 +71,85 @@
|
|||||||
</Setter>
|
</Setter>
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
|
<ControlTemplate x:Key="TabControlPlusTemplate" TargetType="controls:TabControl">
|
||||||
|
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
|
||||||
|
<Grid x:Name="templateRoot" ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition x:Name="ColumnDefinition0"/>
|
||||||
|
<ColumnDefinition x:Name="ColumnDefinition1" Width="0"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="*"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Border Background="{TemplateBinding Background}" BorderThickness="0,0,0,1" BorderBrush="{DynamicResource BorderBrush}">
|
||||||
|
<controls:TabPanel MinHeight="{TemplateBinding TabItemHeight}" TabItemHeight="{TemplateBinding TabItemHeight}" TabItemWidth="{TemplateBinding TabItemWidth}" IsEnableTabFill="{TemplateBinding IsEnableTabFill}" Margin="0,0,-1,-1" x:Name="PART_HeaderPanel" HorizontalAlignment="Left" Background="{DynamicResource SecondaryTextBrush}" IsItemsHost="true" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1">
|
||||||
|
<interactivity:Interaction.Behaviors>
|
||||||
|
<interactivity:FluidMoveBehavior AppliesTo="Children" Duration="{Binding FluidMoveDuration,ElementName=PART_HeaderPanel}">
|
||||||
|
<interactivity:FluidMoveBehavior.EaseX>
|
||||||
|
<CubicEase EasingMode="EaseOut"/>
|
||||||
|
</interactivity:FluidMoveBehavior.EaseX>
|
||||||
|
</interactivity:FluidMoveBehavior>
|
||||||
|
</interactivity:Interaction.Behaviors>
|
||||||
|
</controls:TabPanel>
|
||||||
|
</Border>
|
||||||
|
<Border x:Name="contentPanel" Background="{DynamicResource SecondaryRegionBrush}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="1" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local">
|
||||||
|
<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
|
||||||
|
</Border>
|
||||||
|
<Border Visibility="{Binding Visibility,ElementName=PART_OverflowButton}" Margin="0,-1,0,0" Grid.Row="0" Grid.Column="0" BorderThickness="1,0,0,1" BorderBrush="{DynamicResource BorderBrush}" Background="{DynamicResource RegionBrush}" HorizontalAlignment="Right">
|
||||||
|
<controls:ContextMenuToggleButton x:Name="PART_OverflowButton" Visibility="Collapsed" Style="{StaticResource ToggleButtonIconTransparent}" controls:IconSwitchElement.Geometry="{StaticResource DownGeometry}" controls:IconSwitchElement.GeometrySelected="{StaticResource UpGeometry}"/>
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
</ControlTemplate>
|
||||||
|
|
||||||
|
<ControlTemplate x:Key="TabControlPlusScrollableTemplate" TargetType="controls:TabControl">
|
||||||
|
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
|
||||||
|
<Grid x:Name="templateRoot" ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
|
||||||
|
<Grid.ColumnDefinitions>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
<ColumnDefinition/>
|
||||||
|
<ColumnDefinition Width="Auto"/>
|
||||||
|
</Grid.ColumnDefinitions>
|
||||||
|
<Grid.RowDefinitions>
|
||||||
|
<RowDefinition Height="Auto"/>
|
||||||
|
<RowDefinition Height="*"/>
|
||||||
|
</Grid.RowDefinitions>
|
||||||
|
<Border Visibility="{Binding Visibility,ElementName=PART_OverflowButton}" Margin="0,-1,0,0" Grid.Row="0" Grid.Column="0" BorderThickness="0,0,1,1" BorderBrush="{DynamicResource BorderBrush}" Background="{DynamicResource RegionBrush}" HorizontalAlignment="Left" Panel.ZIndex="2">
|
||||||
|
<Border.CacheMode>
|
||||||
|
<BitmapCache SnapsToDevicePixels="True"/>
|
||||||
|
</Border.CacheMode>
|
||||||
|
<Button Style="{StaticResource ButtonIcon}" Padding="8" controls:IconElement.Geometry="{StaticResource LeftGeometry}" Foreground="{DynamicResource PrimaryTextBrush}" Background="{DynamicResource SecondaryRegionBrush}" x:Name="PART_ScrollButtonLeft"/>
|
||||||
|
</Border>
|
||||||
|
<controls:ScrollViewer HorizontalScrollBarVisibility="Hidden" CanMouseWheel="True" Orientation="Horizontal" IsEnableInertia="True" Grid.Row="0" Grid.Column="1" IsDeferredScrollingEnabled="True" x:Name="PART_OverflowScrollviewer">
|
||||||
|
<Border Background="{TemplateBinding Background}" BorderThickness="0,0,0,1" BorderBrush="{DynamicResource BorderBrush}" >
|
||||||
|
<controls:TabPanel MinHeight="{TemplateBinding TabItemHeight}" TabItemHeight="{TemplateBinding TabItemHeight}" TabItemWidth="{TemplateBinding TabItemWidth}" IsEnableTabFill="{TemplateBinding IsEnableTabFill}" Margin="0,0,-1,-1" x:Name="PART_HeaderPanel" HorizontalAlignment="Left" Background="{DynamicResource SecondaryTextBrush}" IsItemsHost="true" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1">
|
||||||
|
<interactivity:Interaction.Behaviors>
|
||||||
|
<interactivity:FluidMoveBehavior AppliesTo="Children" Duration="{Binding FluidMoveDuration,ElementName=PART_HeaderPanel}">
|
||||||
|
<interactivity:FluidMoveBehavior.EaseX>
|
||||||
|
<CubicEase EasingMode="EaseOut"/>
|
||||||
|
</interactivity:FluidMoveBehavior.EaseX>
|
||||||
|
</interactivity:FluidMoveBehavior>
|
||||||
|
</interactivity:Interaction.Behaviors>
|
||||||
|
</controls:TabPanel>
|
||||||
|
</Border>
|
||||||
|
</controls:ScrollViewer>
|
||||||
|
<Border Visibility="{Binding Visibility,ElementName=PART_OverflowButton}" Margin="0,-1,0,0" Grid.Row="0" Grid.Column="2" BorderThickness="1,0,0,1" BorderBrush="{DynamicResource BorderBrush}" Background="{DynamicResource RegionBrush}" HorizontalAlignment="Right">
|
||||||
|
<Border.CacheMode>
|
||||||
|
<BitmapCache SnapsToDevicePixels="True"/>
|
||||||
|
</Border.CacheMode>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<Button Style="{StaticResource ButtonIcon}" BorderBrush="{DynamicResource BorderBrush}" Padding="8" BorderThickness="0,0,1,0" controls:IconElement.Geometry="{StaticResource RightGeometry}" Foreground="{DynamicResource PrimaryTextBrush}" Background="{DynamicResource SecondaryRegionBrush}" x:Name="PART_ScrollButtonRight"/>
|
||||||
|
<controls:ContextMenuToggleButton x:Name="PART_OverflowButton" Visibility="Collapsed" Style="{StaticResource ToggleButtonIconTransparent}" controls:IconSwitchElement.Geometry="{StaticResource DownGeometry}" controls:IconSwitchElement.GeometrySelected="{StaticResource UpGeometry}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</Border>
|
||||||
|
<Border x:Name="contentPanel" Background="{DynamicResource SecondaryRegionBrush}" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local">
|
||||||
|
<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
|
||||||
|
</Border>
|
||||||
|
</Grid>
|
||||||
|
</Border>
|
||||||
|
</ControlTemplate>
|
||||||
|
|
||||||
<Style TargetType="controls:TabControl">
|
<Style TargetType="controls:TabControl">
|
||||||
<Setter Property="Padding" Value="0"/>
|
<Setter Property="Padding" Value="0"/>
|
||||||
<Setter Property="Background" Value="{DynamicResource RegionBrush}"/>
|
<Setter Property="Background" Value="{DynamicResource RegionBrush}"/>
|
||||||
@@ -78,41 +157,16 @@
|
|||||||
<Setter Property="HorizontalContentAlignment" Value="Center"/>
|
<Setter Property="HorizontalContentAlignment" Value="Center"/>
|
||||||
<Setter Property="VerticalContentAlignment" Value="Center"/>
|
<Setter Property="VerticalContentAlignment" Value="Center"/>
|
||||||
<Setter Property="BorderThickness" Value="1"/>
|
<Setter Property="BorderThickness" Value="1"/>
|
||||||
<Setter Property="Template">
|
<Setter Property="Template" Value="{StaticResource TabControlPlusTemplate}"/>
|
||||||
<Setter.Value>
|
<Style.Triggers>
|
||||||
<ControlTemplate TargetType="controls:TabControl">
|
<MultiTrigger>
|
||||||
<Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}">
|
<MultiTrigger.Conditions>
|
||||||
<Grid x:Name="templateRoot" ClipToBounds="true" SnapsToDevicePixels="true" KeyboardNavigation.TabNavigation="Local">
|
<Condition Property="IsScrollable" Value="True"/>
|
||||||
<Grid.ColumnDefinitions>
|
<Condition Property="IsEnableTabFill" Value="False"/>
|
||||||
<ColumnDefinition x:Name="ColumnDefinition0"/>
|
</MultiTrigger.Conditions>
|
||||||
<ColumnDefinition x:Name="ColumnDefinition1" Width="0"/>
|
<Setter Property="Template" Value="{StaticResource TabControlPlusScrollableTemplate}"/>
|
||||||
</Grid.ColumnDefinitions>
|
</MultiTrigger>
|
||||||
<Grid.RowDefinitions>
|
</Style.Triggers>
|
||||||
<RowDefinition x:Name="RowDefinition0" Height="Auto"/>
|
|
||||||
<RowDefinition x:Name="RowDefinition1" Height="*"/>
|
|
||||||
</Grid.RowDefinitions>
|
|
||||||
<Border Background="{TemplateBinding Background}" BorderThickness="0,0,0,1" BorderBrush="{DynamicResource BorderBrush}">
|
|
||||||
<controls:TabPanel MinHeight="{TemplateBinding TabItemHeight}" TabItemHeight="{TemplateBinding TabItemHeight}" TabItemWidth="{TemplateBinding TabItemWidth}" IsEnableTabFill="{TemplateBinding IsEnableTabFill}" Margin="0,0,-1,-1" x:Name="PART_HeaderPanel" HorizontalAlignment="Left" Background="{DynamicResource SecondaryTextBrush}" IsItemsHost="true" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1">
|
|
||||||
<interactivity:Interaction.Behaviors>
|
|
||||||
<interactivity:FluidMoveBehavior AppliesTo="Children" Duration="{Binding FluidMoveDuration,ElementName=PART_HeaderPanel}">
|
|
||||||
<interactivity:FluidMoveBehavior.EaseX>
|
|
||||||
<CubicEase EasingMode="EaseOut"/>
|
|
||||||
</interactivity:FluidMoveBehavior.EaseX>
|
|
||||||
</interactivity:FluidMoveBehavior>
|
|
||||||
</interactivity:Interaction.Behaviors>
|
|
||||||
</controls:TabPanel>
|
|
||||||
</Border>
|
|
||||||
<Border x:Name="contentPanel" Background="{DynamicResource SecondaryRegionBrush}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="1" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local">
|
|
||||||
<ContentPresenter x:Name="PART_SelectedContentHost" ContentSource="SelectedContent" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
|
|
||||||
</Border>
|
|
||||||
<Border Visibility="{Binding Visibility,ElementName=PART_OverflowButton}" Margin="0,-1,0,0" Grid.Row="0" Grid.Column="0" BorderThickness="1,0,0,1" BorderBrush="{DynamicResource BorderBrush}" Background="{DynamicResource RegionBrush}" HorizontalAlignment="Right">
|
|
||||||
<controls:ContextMenuToggleButton x:Name="PART_OverflowButton" Visibility="Collapsed" Style="{StaticResource ToggleButtonIconTransparent}" controls:IconSwitchElement.Geometry="{StaticResource DownGeometry}" controls:IconSwitchElement.GeometrySelected="{StaticResource UpGeometry}"/>
|
|
||||||
</Border>
|
|
||||||
</Grid>
|
|
||||||
</Border>
|
|
||||||
</ControlTemplate>
|
|
||||||
</Setter.Value>
|
|
||||||
</Setter>
|
|
||||||
</Style>
|
</Style>
|
||||||
|
|
||||||
<Style BasedOn="{StaticResource TabControlBaseStyle}" TargetType="TabControl"/>
|
<Style BasedOn="{StaticResource TabControlBaseStyle}" TargetType="TabControl"/>
|
||||||
|
|||||||
Reference in new issue
Block a user