From 1ddad8fcd0b84531d51ec00fb9ff328caeee3f07 Mon Sep 17 00:00:00 2001 From: ema Date: Fri, 27 Sep 2024 11:12:14 +0800 Subject: [PATCH] feat: MenuItemGroup --- README.md | 2 +- src/Wpf.Ui.Test/MainWindow.xaml | 28 ++++++- src/Wpf.Ui.Test/Wpf.Ui.Test.csproj | 3 + .../Controls/Primitives/MenuItemGroup.cs | 76 +++++++++++++++++++ 4 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 src/Wpf.Ui.Violeta/Controls/Primitives/MenuItemGroup.cs diff --git a/README.md b/README.md index c21d8b3..92aca91 100644 --- a/README.md +++ b/README.md @@ -110,7 +110,7 @@ Similar to WPF UI. MessageBoxResult result = await MessageBox.QuestionAsync("This is a question and do you want to click OK?"); ``` -- **ToggleButtonGroup** / **RadioButtonGroup** +- **ToggleButtonGroup** / **RadioButtonGroup** / **MenuItemGroup** > Turn the ToggleButton and RadioButton under the same Group into a radio button. diff --git a/src/Wpf.Ui.Test/MainWindow.xaml b/src/Wpf.Ui.Test/MainWindow.xaml index 30f09d1..9371ba0 100644 --- a/src/Wpf.Ui.Test/MainWindow.xaml +++ b/src/Wpf.Ui.Test/MainWindow.xaml @@ -2,7 +2,9 @@ x:Class="Wpf.Ui.Test.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:b="http://schemas.github.com/computedbehaviors/2024/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:i="http://schemas.microsoft.com/xaml/behaviors" xmlns:local="clr-namespace:Wpf.Ui.Test" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml" @@ -572,7 +574,7 @@ Margin="0,8,0,0" FontSize="14" FontWeight="Black" - Text="ToggleButtonGroup / RadioButtonGroup" /> + Text="ToggleButtonGroup / RadioButtonGroup / MenuItemGroup" /> @@ -586,6 +588,30 @@ Margin="8,0,0,0" vio:ToggleButtonGroup.Group="{DynamicResource ToggleButtonGroup}" Content="2nd" /> + diff --git a/src/Wpf.Ui.Test/Wpf.Ui.Test.csproj b/src/Wpf.Ui.Test/Wpf.Ui.Test.csproj index e9638c7..d044886 100644 --- a/src/Wpf.Ui.Test/Wpf.Ui.Test.csproj +++ b/src/Wpf.Ui.Test/Wpf.Ui.Test.csproj @@ -25,6 +25,9 @@ + + + diff --git a/src/Wpf.Ui.Violeta/Controls/Primitives/MenuItemGroup.cs b/src/Wpf.Ui.Violeta/Controls/Primitives/MenuItemGroup.cs new file mode 100644 index 0000000..34239de --- /dev/null +++ b/src/Wpf.Ui.Violeta/Controls/Primitives/MenuItemGroup.cs @@ -0,0 +1,76 @@ +using System.Collections.Generic; +using System.Windows; +using System.Windows.Controls; + +namespace Wpf.Ui.Violeta.Controls.Primitives; + +public class MenuItemGroup : List +{ + public bool IsCanCancel { get; set; } = false; + + public static MenuItemGroup GetGroup(DependencyObject obj) + { + return (MenuItemGroup)obj.GetValue(GroupProperty); + } + + public static void SetGroup(DependencyObject obj, MenuItemGroup value) + { + obj.SetValue(GroupProperty, value); + } + + public static readonly DependencyProperty GroupProperty = + DependencyProperty.RegisterAttached("Group", typeof(MenuItemGroup), typeof(MenuItemGroup), new PropertyMetadata(null!, OnGroupChanged)); + + private static void OnGroupChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) + { + if (d is MenuItem tb) + { + ((MenuItemGroup)e.NewValue).Join(tb); + } + } + + protected bool Handling { get; set; } = false; + + public MenuItemGroup JoinWith(MenuItem menuItem) + { + Join(menuItem); + return this; + } + + public void Join(MenuItem menuItem) + { + Add(menuItem); + + menuItem.Checked += (s, e) => + { + if (s is MenuItem mi && GetGroup(mi) is MenuItemGroup group) + { + Handling = true; + foreach (MenuItem tb in group) + { + if (tb != mi) + { + tb.IsChecked = false; + } + } + Handling = false; + } + }; + menuItem.Unchecked += (s, e) => + { + if (!IsCanCancel && !Handling && s is MenuItem mi) + { + mi.IsChecked = true; + } + }; + SetGroup(menuItem, this); + } + + public void Unjoin(MenuItem checkBox) + { + Remove(checkBox); + SetGroup(checkBox, null!); + } + + public static MenuItemGroup New() => []; +}