From 9f99c50438eb9b9f75a40813c7e9ed96a4f3cce3 Mon Sep 17 00:00:00 2001 From: Curtis Wensley Date: Fri, 19 May 2023 15:24:57 -0700 Subject: [PATCH] Wpf: Fix odd sizes of toolitems when there is no label Also refactor to share more code. --- .../Forms/ToolBar/ButtonToolItemHandler.cs | 49 ++------------ .../Forms/ToolBar/CheckToolItemHandler.cs | 44 +----------- .../Forms/ToolBar/DropDownToolItemHandler.cs | 44 +----------- .../Forms/ToolBar/RadioToolItemHandler.cs | 40 +---------- src/Eto.Wpf/Forms/ToolBar/ToolItemHandler.cs | 67 ++++++++++++++++++- 5 files changed, 77 insertions(+), 167 deletions(-) diff --git a/src/Eto.Wpf/Forms/ToolBar/ButtonToolItemHandler.cs b/src/Eto.Wpf/Forms/ToolBar/ButtonToolItemHandler.cs index 1c1168fae4..fae09131ff 100755 --- a/src/Eto.Wpf/Forms/ToolBar/ButtonToolItemHandler.cs +++ b/src/Eto.Wpf/Forms/ToolBar/ButtonToolItemHandler.cs @@ -4,74 +4,33 @@ using swc = System.Windows.Controls; using swm = System.Windows.Media; using sw = System.Windows; -using System.Windows; namespace Eto.Wpf.Forms.ToolBar { public class ButtonToolItemHandler : ToolItemHandler, ButtonToolItem.IHandler { - Image image; - readonly swc.Image swcImage; - readonly swc.TextBlock label; - public ButtonToolItemHandler () { Control = new swc.Button(); - swcImage = new swc.Image(); - label = new swc.TextBlock(); - label.VerticalAlignment = sw.VerticalAlignment.Center; - label.Margin = new Thickness(2, 0, 2, 0); - var panel = new swc.StackPanel { Orientation = swc.Orientation.Horizontal }; - panel.Children.Add(swcImage); - panel.Children.Add(label); - Control.Content = panel; Control.Click += Control_Click; - sw.Automation.AutomationProperties.SetLabeledBy(Control, label); } - protected override void OnImageSizeChanged() + protected override void Initialize() { - base.OnImageSizeChanged(); - var size = ImageSize; - swcImage.MaxHeight = size?.Height ?? double.PositiveInfinity; - swcImage.MaxWidth = size?.Width ?? double.PositiveInfinity; + base.Initialize(); + Control.Content = CreateContent(); } - private void Control_Click(object sender, RoutedEventArgs e) + private void Control_Click(object sender, sw.RoutedEventArgs e) { Widget.OnClick(EventArgs.Empty); } - public override string Text - { - get { return label.Text.ToEtoMnemonic(); } - set { label.Text = value.ToPlatformMnemonic(); } - } - public override string ToolTip { get { return Control.ToolTip as string; } set { Control.ToolTip = value; } } - public override Image Image - { - get { return image; } - set - { - image = value; - swcImage.Source = image.ToWpf(Screen.PrimaryScreen.LogicalPixelSize, swcImage.GetMaxSize().ToEtoSize()); - } - } - - public override bool Enabled - { - get { return Control.IsEnabled; } - set - { - Control.IsEnabled = value; - swcImage.IsEnabled = value; - } - } } } diff --git a/src/Eto.Wpf/Forms/ToolBar/CheckToolItemHandler.cs b/src/Eto.Wpf/Forms/ToolBar/CheckToolItemHandler.cs index 964545ea2b..3f66ff0fb4 100755 --- a/src/Eto.Wpf/Forms/ToolBar/CheckToolItemHandler.cs +++ b/src/Eto.Wpf/Forms/ToolBar/CheckToolItemHandler.cs @@ -10,36 +10,21 @@ namespace Eto.Wpf.Forms.ToolBar { public class CheckToolItemHandler : ToolItemHandler, CheckToolItem.IHandler { - Image image; - readonly swc.Image swcImage; - readonly swc.TextBlock label; public CheckToolItemHandler () { Control = new swc.Primitives.ToggleButton { IsThreeState = false }; - swcImage = new swc.Image(); - label = new swc.TextBlock (); - label.Margin = new Thickness(2, 0, 2, 0); - label.VerticalAlignment = sw.VerticalAlignment.Center; - var panel = new swc.StackPanel { Orientation = swc.Orientation.Horizontal }; - panel.Children.Add (swcImage); - panel.Children.Add (label); - Control.Content = panel; Control.Checked += Control_CheckedChanged; Control.Unchecked += Control_CheckedChanged; Control.Click += Control_Click; - - sw.Automation.AutomationProperties.SetLabeledBy(Control, label); } - protected override void OnImageSizeChanged() + protected override void Initialize() { - base.OnImageSizeChanged(); - var size = ImageSize; - swcImage.MaxHeight = size?.Height ?? double.PositiveInfinity; - swcImage.MaxWidth = size?.Width ?? double.PositiveInfinity; + base.Initialize(); + Control.Content = CreateContent(); } private void Control_Click(object sender, RoutedEventArgs e) @@ -57,33 +42,10 @@ public bool Checked get { return Control.IsChecked ?? false; } set { Control.IsChecked = value; } } - - public override string Text - { - get { return label.Text.ToEtoMnemonic(); } - set { label.Text = value.ToPlatformMnemonic(); } - } - public override string ToolTip { get { return Control.ToolTip as string; } set { Control.ToolTip = value; } } - - public override Image Image - { - get { return image; } - set - { - image = value; - swcImage.Source = image.ToWpf(Screen.PrimaryScreen.LogicalPixelSize, swcImage.GetMaxSize().ToEtoSize()); - } - } - - public override bool Enabled - { - get { return Control.IsEnabled; } - set { Control.IsEnabled = value; } - } } } diff --git a/src/Eto.Wpf/Forms/ToolBar/DropDownToolItemHandler.cs b/src/Eto.Wpf/Forms/ToolBar/DropDownToolItemHandler.cs index a48cc1ee97..aec265c764 100755 --- a/src/Eto.Wpf/Forms/ToolBar/DropDownToolItemHandler.cs +++ b/src/Eto.Wpf/Forms/ToolBar/DropDownToolItemHandler.cs @@ -10,9 +10,6 @@ namespace Eto.Wpf.Forms.ToolBar { public class DropDownToolItemHandler : ToolItemHandler, DropDownToolItem.IHandler { - Image image; - readonly swc.Image swcImage; - readonly swc.TextBlock label; readonly swc.MenuItem root; readonly sw.Shapes.Path arrow; @@ -22,25 +19,16 @@ public DropDownToolItemHandler () Control = new swc.Menu(); Control.Background = swm.Brushes.Transparent; Control.Items.Add(root); - swcImage = new swc.Image(); - label = new swc.TextBlock(); - label.Margin = new Thickness(2, 0, 2, 0); - label.VerticalAlignment = sw.VerticalAlignment.Center; arrow = new sw.Shapes.Path { Data = swm.Geometry.Parse("M 0 0 L 3 3 L 6 0 Z"), VerticalAlignment = sw.VerticalAlignment.Center, Margin = new Thickness(2, 2, 0, 0), Fill = swm.Brushes.Black }; - var panel = new swc.StackPanel { Orientation = swc.Orientation.Horizontal, Children = { swcImage, label, arrow } }; - root.Header = panel; root.Click += Control_Click; root.SubmenuOpened += Control_Click; - sw.Automation.AutomationProperties.SetLabeledBy(Control, label); } - protected override void OnImageSizeChanged() + protected override void Initialize() { - base.OnImageSizeChanged(); - var size = ImageSize; - swcImage.MaxHeight = size?.Height ?? double.PositiveInfinity; - swcImage.MaxWidth = size?.Width ?? double.PositiveInfinity; + base.Initialize(); + root.Header = CreateContent(arrow); } private void Control_Click(object sender, RoutedEventArgs e) @@ -52,38 +40,12 @@ private void Control_Click(object sender, RoutedEventArgs e) Widget.OnClick(EventArgs.Empty); } - public override string Text - { - get { return label.Text.ToEtoMnemonic(); } - set { label.Text = value.ToPlatformMnemonic(); } - } - public override string ToolTip { get { return Control.ToolTip as string; } set { Control.ToolTip = value; } } - public override Image Image - { - get { return image; } - set - { - image = value; - swcImage.Source = image.ToWpf(Screen.PrimaryScreen.LogicalPixelSize, swcImage.GetMaxSize().ToEtoSize()); - } - } - - public override bool Enabled - { - get { return Control.IsEnabled; } - set - { - Control.IsEnabled = value; - swcImage.IsEnabled = value; - } - } - /// /// Gets or sets whether the drop arrow is shown on the button. /// diff --git a/src/Eto.Wpf/Forms/ToolBar/RadioToolItemHandler.cs b/src/Eto.Wpf/Forms/ToolBar/RadioToolItemHandler.cs index f8361b41d4..8e619375f3 100755 --- a/src/Eto.Wpf/Forms/ToolBar/RadioToolItemHandler.cs +++ b/src/Eto.Wpf/Forms/ToolBar/RadioToolItemHandler.cs @@ -12,42 +12,24 @@ namespace Eto.Wpf.Forms.ToolBar { public class RadioToolItemHandler : ToolItemHandler, RadioToolItem.IHandler { - Image image; - readonly swc.Image swcImage; - readonly swc.TextBlock label; - public RadioToolItemHandler() { Control = new swc.Primitives.ToggleButton { IsThreeState = false }; - swcImage = new swc.Image(); - label = new swc.TextBlock(); - label.Margin = new Thickness(2, 0, 2, 0); - label.VerticalAlignment = sw.VerticalAlignment.Center; - var panel = new swc.StackPanel { Orientation = swc.Orientation.Horizontal }; - panel.Children.Add(swcImage); - panel.Children.Add(label); - Control.Content = panel; - Control.Checked += Control_Checked; Control.Unchecked += Control_Unchecked; Control.PreviewMouseDown += Control_PreviewMouseDown; Control.Click += Control_Click; - - sw.Automation.AutomationProperties.SetLabeledBy(Control, label); } - protected override void OnImageSizeChanged() + protected override void Initialize() { - base.OnImageSizeChanged(); - var size = ImageSize; - swcImage.MaxHeight = size?.Height ?? double.PositiveInfinity; - swcImage.MaxWidth = size?.Width ?? double.PositiveInfinity; + base.Initialize(); + Control.Content = CreateContent(); } - private void Control_Click(object sender, RoutedEventArgs e) { Widget.OnClick(EventArgs.Empty); @@ -90,28 +72,12 @@ public bool Checked set { Control.IsChecked = value; } } - public override string Text - { - get { return label.Text.ToEtoMnemonic(); } - set { label.Text = value.ToPlatformMnemonic(); } - } - public override string ToolTip { get { return Control.ToolTip as string; } set { Control.ToolTip = value; } } - public override Image Image - { - get { return image; } - set - { - image = value; - swcImage.Source = image.ToWpf(Screen.PrimaryScreen.LogicalPixelSize, swcImage.GetMaxSize().ToEtoSize()); - } - } - public override bool Enabled { get { return Control.IsEnabled; } diff --git a/src/Eto.Wpf/Forms/ToolBar/ToolItemHandler.cs b/src/Eto.Wpf/Forms/ToolBar/ToolItemHandler.cs index fbfd6e8d79..e0e1c9558e 100755 --- a/src/Eto.Wpf/Forms/ToolBar/ToolItemHandler.cs +++ b/src/Eto.Wpf/Forms/ToolBar/ToolItemHandler.cs @@ -2,6 +2,7 @@ using Eto.Forms; using System; using sw = System.Windows; +using swc = System.Windows.Controls; namespace Eto.Wpf.Forms.ToolBar { @@ -15,11 +16,47 @@ public abstract class ToolItemHandler : WidgetHandler : WidgetHandler Control.Visibility == sw.Visibility.Visible;