Skip to content

Commit

Permalink
Merge pull request #1201 from HandyOrg/add-ribbon-menu
Browse files Browse the repository at this point in the history
Add ribbon menu
  • Loading branch information
NaBian authored Jun 13, 2022
2 parents 618d367 + 62ed7bf commit 28a485f
Show file tree
Hide file tree
Showing 17 changed files with 1,309 additions and 19 deletions.
163 changes: 158 additions & 5 deletions src/Net_40/HandyControl_Net_40/Themes/Theme.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -832,6 +832,31 @@
<tools:ComboBoxItemCapsuleStyleSelector x:Key="ComboBoxItemCapsuleStyleSelector" />
<hc:HorizontalAlignmentPathTemplateSelector x:Key="HorizontalAlignmentPathTemplateSelector" />
<hc:VerticalAlignmentPathTemplateSelector x:Key="VerticalAlignmentPathTemplateSelector" />
<Geometry x:Key="NailGeometry">M956.553 366.486L657.514 67.447c-7.888-7.888-18.204-11.772-28.52-11.772s-20.632 3.884-28.52 11.772L404.958 263.085c-14.806-1.7-29.734-2.428-44.662-2.428-88.837 0-177.675 29.249-250.614 87.746-18.69 14.927-20.268 42.962-3.277 59.953l220.516 220.517L65.506 890.046c-3.156 3.155-5.219 7.403-5.583 11.893l-4.126 45.147c-1.093 11.408 8.01 21.117 19.296 21.117 0.607 0 1.214 0 1.82-0.121l45.148-4.126c4.49-0.364 8.738-2.428 11.893-5.583L395.37 696.957l220.517 220.517c7.888 7.888 18.204 11.772 28.52 11.772 11.772 0 23.423-5.097 31.433-15.05 68.327-85.317 96.726-192.117 85.197-295.397l195.516-195.515c15.655-15.535 15.655-41.021 0-56.798zM699.142 557.268l-29.734 29.734 4.612 41.75c4.49 40.898 1.213 81.555-9.952 120.998-6.554 23.059-15.535 45.026-26.943 65.779L208.593 386.753c15.655-8.616 31.918-15.898 48.909-21.724 33.01-11.408 67.599-17.112 102.794-17.112 11.651 0 23.423 0.607 35.074 1.942l41.75 4.612 29.733-29.734 162.262-162.262 232.41 232.41-162.383 162.383z</Geometry>
<Geometry x:Key="DialogBoxLauncherGeometry">M0,0 8,0 8,1 1,1 1,8 0,8 M 3.7,3 8,7.3 8,4 9,4 9,9 4,9 4,8 7.3,8 3,3.7</Geometry>
<Style TargetType="hc:RibbonTab">
<Setter Property="Focusable" Value="False" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="hc:RibbonTab">
<hc:SimplePanel Visibility="Collapsed" x:Name="PART_RootContainer">
<Border x:Name="mainBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0,0,0,3" Background="{TemplateBinding Background}" Margin="0" />
<ScrollViewer hc:ScrollViewerAttach.Orientation="Horizontal" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Disabled">
<ItemsPresenter />
</ScrollViewer>
</hc:SimplePanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<SolidColorBrush o:Freeze="True" x:Key="LightPrimaryBrush" Color="{DynamicResource LightPrimaryColor}" />
<LinearGradientBrush o:Freeze="True" x:Key="PrimaryBrush" EndPoint="1,0" StartPoint="0,0">
<GradientStop o:Freeze="True" Color="{DynamicResource PrimaryColor}" Offset="0" />
Expand Down Expand Up @@ -7056,16 +7081,18 @@
<Setter Property="ItemContainerStyle" Value="{StaticResource ComboBoxItem.Small}" />
<Setter Property="hc:InfoElement.MinContentHeight" Value="20" />
<Setter Property="hc:InfoElement.ContentHeight" Value="20" />
<Setter Property="hc:TitleElement.MarginOnTheLeft" Value="0,3,6,3" />
<Setter Property="Padding" Value="6,0" />
<Setter Property="hc:TitleElement.MarginOnTheLeft" Value="0,3,6,0" />
<Setter Property="Padding" Value="6,2,6,1" />
<Setter Property="MinHeight" Value="20" />
</Style>
<Style BasedOn="{StaticResource ComboBoxPlusBaseStyle}" TargetType="hc:ComboBox" />
<Style x:Key="ComboBoxPlus.Small" BasedOn="{StaticResource ComboBoxPlusBaseStyle}" TargetType="hc:ComboBox">
<Setter Property="ItemContainerStyle" Value="{StaticResource ComboBoxItem.Small}" />
<Setter Property="hc:InfoElement.MinContentHeight" Value="20" />
<Setter Property="hc:InfoElement.ContentHeight" Value="20" />
<Setter Property="hc:TitleElement.MarginOnTheLeft" Value="0,3,6,3" />
<Setter Property="Padding" Value="6,0" />
<Setter Property="hc:TitleElement.MarginOnTheLeft" Value="0,3,6,0" />
<Setter Property="Padding" Value="6,2,6,1" />
<Setter Property="MinHeight" Value="20" />
</Style>
<Style BasedOn="{StaticResource WatermarkTextBoxBaseStyle}" TargetType="hc:WatermarkTextBox" />
<Style BasedOn="{StaticResource TextBoxBaseStyle}" TargetType="TextBox" />
Expand Down Expand Up @@ -10867,7 +10894,7 @@
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}" />
<Setter Property="Background" Value="{DynamicResource RegionBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource PrimaryBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource TitleBrush}" />
<Setter Property="Margin" Value="0" />
<Setter Property="Padding" Value="{StaticResource DefaultControlPadding}" />
<Setter Property="MinHeight" Value="{StaticResource DefaultControlHeight}" />
Expand Down Expand Up @@ -13335,6 +13362,132 @@
</Setter>
</Style>
<Style BasedOn="{StaticResource RateBaseStyle}" TargetType="hc:Rate" />
<Style TargetType="hc:RibbonGroup">
<Setter Property="Focusable" Value="False" />
<Setter Property="Height" Value="90" />
<Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}" />
<Setter Property="Padding" Value="6 6 6 0" />
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<WrapPanel />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="hc:RibbonGroup">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ItemsPresenter Grid.ColumnSpan="2" Margin="{TemplateBinding Padding}" />
<ContentPresenter Name="ContentPresenter" VerticalAlignment="Bottom" TextElement.Foreground="{DynamicResource SecondaryTextBrush}" Grid.Column="0" Grid.ColumnSpan="2" Margin="10,0,10,2" ContentSource="Header" HorizontalAlignment="Center" Grid.Row="1" />
<Button hc:Poptip.Instance="{TemplateBinding LauncherPoptip}" Command="interactivity:ControlCommands.More" Visibility="{Binding ShowLauncherButton,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource Boolean2VisibilityConverter}}" Margin="0,0,2,0" Grid.Column="1" Width="16" Height="16" Grid.Row="1" HorizontalAlignment="Right" Style="{StaticResource ButtonCustom}" hc:BackgroundSwitchElement.MouseHoverBackground="{DynamicResource SecondaryRegionBrush}">
<Path Width="9" Height="9" Stretch="Uniform" Data="{StaticResource DialogBoxLauncherGeometry}" Fill="{DynamicResource SecondaryTextBrush}" />
</Button>
<Border Visibility="{Binding ShowSplitter,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource Boolean2VisibilityConverter}}" Margin="0,4" Grid.Column="2" Grid.Row="0" Grid.RowSpan="2" Width="1" Background="{TemplateBinding BorderBrush}" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="ShowLauncherButton" Value="True">
<Setter TargetName="ContentPresenter" Property="Margin" Value="20,0,20,2" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="hc:RibbonTabHeader">
<Setter Property="FocusVisualStyle" Value="{x:Null}" />
<Setter Property="Foreground" Value="{DynamicResource SecondaryTextBrush}" />
<Setter Property="BorderBrush" Value="{DynamicResource TitleBrush}" />
<Setter Property="Background" Value="Transparent" />
<Setter Property="Margin" Value="0" />
<Setter Property="Padding" Value="{StaticResource DefaultControlPadding}" />
<Setter Property="MinHeight" Value="{StaticResource DefaultControlHeight}" />
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
<Setter Property="VerticalContentAlignment" Value="Stretch" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="hc:RibbonTabHeader">
<Border Background="{TemplateBinding Background}">
<hc:SimplePanel x:Name="templateRoot" SnapsToDevicePixels="true">
<Border x:Name="BorderBottom" Visibility="{Binding IsSelected,RelativeSource={RelativeSource TemplatedParent},Converter={StaticResource Boolean2VisibilityConverter}}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0,0,0,2" Margin="12,0,12,2" />
<ContentPresenter x:Name="ContentPresenter" Focusable="False" HorizontalAlignment="Center" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="Center" />
</hc:SimplePanel>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Foreground" Value="{DynamicResource PrimaryTextBrush}" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="hc:Ribbon">
<Setter Property="Focusable" Value="False" />
<Setter Property="Panel.ZIndex" Value="{x:Static system:Int32.MaxValue}" />
<Setter Property="ContentHeight" Value="96" />
<Setter Property="Background" Value="{DynamicResource SecondaryRegionBrush}" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="BorderBrush" Value="{DynamicResource BorderBrush}" />
<Setter Property="VerticalAlignment" Value="Top" />
<Setter Property="hc:BorderElement.CornerRadius" Value="{StaticResource DefaultCornerRadius}" />
<Setter Property="Padding" Value="10 0" />
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<hc:SimplePanel />
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="hc:Ribbon">
<hc:ClipGrid x:Name="PART_RootPanel" IsClipEnabled="False">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid x:Name="PART_ContentPanel" Grid.Row="1" Grid.ColumnSpan="3">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Border Margin="{TemplateBinding Padding}" VerticalAlignment="Bottom" Height="{TemplateBinding ContentHeight}" Grid.ColumnSpan="2" CornerRadius="{Binding Path=(hc:BorderElement.CornerRadius),RelativeSource={RelativeSource TemplatedParent}}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{DynamicResource RegionBrush}">
<Border.Effect>
<DropShadowEffect BlurRadius="8" ShadowDepth="2" Direction="-90" Color="{StaticResource EffectShadowColor}" Opacity=".1" RenderingBias="Performance" />
</Border.Effect>
</Border>
<ItemsPresenter x:Name="PART_TabItemsPresenter" VerticalAlignment="Bottom" Height="{TemplateBinding ContentHeight}" Grid.Column="0" Margin="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource ThicknessSplitConverter}, ConverterParameter='1,0,0,0'}" />
<ToggleButton Command="interactivity:ControlCommands.Switch" IsChecked="{Binding IsMinimized, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}" Margin="{Binding Padding, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource ThicknessSplitConverter}, ConverterParameter='0,0,1,0'}" Padding="2 0" Width="16" Height="20" Grid.Column="1" HorizontalAlignment="Right" VerticalAlignment="Bottom" Style="{StaticResource ToggleButtonIconTransparent}" hc:IconElement.Geometry="{StaticResource UpGeometry}" hc:IconSwitchElement.GeometrySelected="{StaticResource NailGeometry}" />
</Grid>
<ContentPresenter Grid.Row="0" Grid.Column="0" ContentSource="PrefixContent" />
<hc:RibbonTabHeaderItemsControl Grid.Row="0" Grid.Column="1" Background="{TemplateBinding Background}" Focusable="False" x:Name="PART_TabHeaderItemsControl" Margin="0,0,0,2">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Margin="{Binding Padding, RelativeSource={RelativeSource AncestorType= hc:Ribbon}}" Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</hc:RibbonTabHeaderItemsControl>
<ContentPresenter Grid.Row="0" Grid.Column="2" ContentSource="PostfixContent" />
</hc:ClipGrid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style BasedOn="{StaticResource RunningBlockBaseStyle}" TargetType="hc:RunningBlock" />
<Style BasedOn="{StaticResource SeparatorBaseStyle}" TargetType="Separator" />
<Style BasedOn="{StaticResource ShieldBaseStyle}" TargetType="hc:Shield" />
Expand Down
53 changes: 51 additions & 2 deletions src/Shared/HandyControl_Shared/Controls/Other/Poptip.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,20 @@
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Input;
using System.Windows.Threading;
using HandyControl.Data;
using HandyControl.Data.Enum;
using HandyControl.Expression.Drawing;
using HandyControl.Tools;

namespace HandyControl.Controls;

public class Poptip : AdornerElement
{
private readonly Popup _popup;

private DispatcherTimer _openTimer;

public Poptip()
{
_popup = new Popup
Expand Down Expand Up @@ -172,6 +177,15 @@ public bool IsOpen
set => SetValue(IsOpenProperty, ValueBoxes.BooleanBox(value));
}

public static readonly DependencyProperty DelayProperty = DependencyProperty.Register(
"Delay", typeof(double), typeof(Poptip), new PropertyMetadata(1000.0), ValidateHelper.IsInRangeOfPosDoubleIncludeZero);

public double Delay
{
get => (double) GetValue(DelayProperty);
set => SetValue(DelayProperty, value);
}

public static Poptip Default => new();

protected sealed override void OnTargetChanged(FrameworkElement element, bool isNew)
Expand Down Expand Up @@ -290,8 +304,43 @@ private void SwitchPoptip(bool isShow)
_popup.PlacementTarget = Target;
UpdateLocation();
}
_popup.IsOpen = isShow;
Target.SetCurrentValue(IsOpenProperty, isShow);

ResetTimer();

var delay = Delay;
if (!isShow || HitMode != HitMode.Hover || MathHelper.IsVerySmall(delay))
{

_popup.IsOpen = isShow;
Target.SetCurrentValue(IsOpenProperty, isShow);
}
else
{
_openTimer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(delay)
};

_openTimer.Tick += OpenTimer_Tick;
_openTimer.Start();
}
}

private void ResetTimer()
{
if (_openTimer != null)
{
_openTimer.Stop();
_openTimer = null;
}
}

private void OpenTimer_Tick(object sender, EventArgs e)
{
_popup.IsOpen = true;
Target.SetCurrentValue(IsOpenProperty, true);

ResetTimer();
}

private void Element_MouseEnter(object sender, MouseEventArgs e)
Expand Down
29 changes: 29 additions & 0 deletions src/Shared/HandyControl_Shared/Controls/Panel/ClipGrid.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using HandyControl.Data;

namespace HandyControl.Controls
{
public class ClipGrid : Grid
{
public static readonly DependencyProperty IsClipEnabledProperty = DependencyProperty.Register(
"IsClipEnabled", typeof(bool), typeof(ClipGrid), new PropertyMetadata(ValueBoxes.TrueBox));

public bool IsClipEnabled
{
get => (bool) GetValue(IsClipEnabledProperty);
set => SetValue(IsClipEnabledProperty, ValueBoxes.BooleanBox(value));
}

protected override Geometry GetLayoutClip(Size layoutSlotSize)
{
if (IsClipEnabled)
{
return base.GetLayoutClip(layoutSlotSize);
}

return null;
}
}
}
Loading

0 comments on commit 28a485f

Please sign in to comment.