From 2fb12122f3a85ed8557285274941736140d38d90 Mon Sep 17 00:00:00 2001 From: NaBian <836904362@qq.com> Date: Sat, 2 Aug 2025 22:45:20 +0800 Subject: [PATCH] chore: add avalonia basic TextBox demo. --- README-cn.md | 3 - README.md | 3 - src/Avalonia/Directory.Build.props | 2 +- .../Data/DemoInfo.json | 2 +- .../HandyControlDemo_Avalonia.csproj | 6 + .../UserControl/Styles/TextBoxDemo.axaml | 90 ++++++ .../UserControl/Styles/TextBoxDemo.axaml.cs | 10 + .../Controls/Attach/InfoElement.cs | 63 ++++ .../Controls/Attach/TextBlockAttach.cs | 53 ++++ .../Controls/Attach/TitleElement.cs | 89 +++++- .../Data/Enum/TitlePlacementType.cs | 7 + .../Themes/Basic/Brushes.axaml | 2 + .../Themes/Basic/Colors.axaml | 2 + .../Themes/Basic/Converters.axaml | 1 + .../Themes/Styles/TextBox.axaml | 292 ++++++++++++++++++ .../HandyControl_Avalonia/Themes/Theme.axaml | 1 + .../Converter/Double2GridLengthConverter.cs | 29 ++ .../Properties/Langs/Lang.cs.resx | 60 ++-- .../Controls/Attach/InfoElement.cs | 4 +- .../Controls/Attach/TitleElement.cs | 6 +- 20 files changed, 677 insertions(+), 48 deletions(-) create mode 100644 src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml create mode 100644 src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml.cs create mode 100644 src/Avalonia/HandyControl_Avalonia/Controls/Attach/InfoElement.cs create mode 100644 src/Avalonia/HandyControl_Avalonia/Controls/Attach/TextBlockAttach.cs create mode 100644 src/Avalonia/HandyControl_Avalonia/Data/Enum/TitlePlacementType.cs create mode 100644 src/Avalonia/HandyControl_Avalonia/Themes/Styles/TextBox.axaml create mode 100644 src/Avalonia/HandyControl_Avalonia/Tools/Converter/Double2GridLengthConverter.cs diff --git a/README-cn.md b/README-cn.md index 3ca61a9d..df1eec5d 100644 --- a/README-cn.md +++ b/README-cn.md @@ -1,6 +1,3 @@ -### 找工作 -我有一个朋友,9 年工作经验,github 主页:https://github.com/DingpingZhang 目前在找上海的工作。他熟悉设计模式并具有大型客户端架构经验,技术栈涉及:python、wpf、pg、react,有意向可联系邮箱:dingpingzhang@outlook.com - ## 友情链接 [SimpleFactoryGenerator](https://github.com/DingpingZhang/SimpleFactoryGenerator) - A simple factory source generator that enables the pattern to not violate the open-close principle. diff --git a/README.md b/README.md index ecdbdc61..4bdc4651 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,3 @@ -### 找工作 -我有一个朋友,9 年工作经验,github 主页:https://github.com/DingpingZhang 目前在找上海的工作。他熟悉设计模式并具有大型客户端架构经验,技术栈涉及:python、wpf、pg、react,有意向可联系邮箱:dingpingzhang@outlook.com - ## Blogroll [SimpleFactoryGenerator](https://github.com/DingpingZhang/SimpleFactoryGenerator) - A simple factory source generator that enables the pattern to not violate the open-close principle. diff --git a/src/Avalonia/Directory.Build.props b/src/Avalonia/Directory.Build.props index d93f9fc3..02fc2c07 100644 --- a/src/Avalonia/Directory.Build.props +++ b/src/Avalonia/Directory.Build.props @@ -1,6 +1,6 @@ enable - 11.1.1 + 11.3.2 diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Data/DemoInfo.json b/src/Avalonia/HandyControlDemo_Avalonia/Data/DemoInfo.json index 6b5fc93e..b97fd95b 100644 --- a/src/Avalonia/HandyControlDemo_Avalonia/Data/DemoInfo.json +++ b/src/Avalonia/HandyControlDemo_Avalonia/Data/DemoInfo.json @@ -13,7 +13,7 @@ [ "ScrollViewer", "NativeScrollViewerDemo", "Brush.ScrollBox", "", "" ], [ "Slider", "SliderDemo", "Brush.Slider", "", "" ], [ "TextBlock", "TextBlockDemo", "Brush.TextBlock", "", "" ], - [ "TextBox", "NativeTextBoxDemo", "Brush.TextBox", "", "" ], + [ "TextBox", "TextBoxDemo", "Brush.TextBox", "", "" ], [ "ComboBox", "NativeComboBoxDemo", "Brush.ComboBox", "", "" ], [ "PasswordBox", "NativePasswordBoxDemo", "Brush.PasswordBox", "", "" ], [ "Expander", "ExpanderDemo", "Brush.Expander", "", "" ], diff --git a/src/Avalonia/HandyControlDemo_Avalonia/HandyControlDemo_Avalonia.csproj b/src/Avalonia/HandyControlDemo_Avalonia/HandyControlDemo_Avalonia.csproj index d4423cf0..6cbc46b6 100644 --- a/src/Avalonia/HandyControlDemo_Avalonia/HandyControlDemo_Avalonia.csproj +++ b/src/Avalonia/HandyControlDemo_Avalonia/HandyControlDemo_Avalonia.csproj @@ -11,6 +11,12 @@ HandyControlDemo HandyControlDemo + + 1701;1702;NETSDK1138 + + + 1701;1702;NETSDK1138 + diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml new file mode 100644 index 00000000..af22a407 --- /dev/null +++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml.cs b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml.cs new file mode 100644 index 00000000..21a25f5f --- /dev/null +++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Styles/TextBoxDemo.axaml.cs @@ -0,0 +1,10 @@ +namespace HandyControlDemo.UserControl; + +public partial class TextBoxDemo : Avalonia.Controls.UserControl +{ + public TextBoxDemo() + { + InitializeComponent(); + } +} + diff --git a/src/Avalonia/HandyControl_Avalonia/Controls/Attach/InfoElement.cs b/src/Avalonia/HandyControl_Avalonia/Controls/Attach/InfoElement.cs new file mode 100644 index 00000000..e522552d --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Controls/Attach/InfoElement.cs @@ -0,0 +1,63 @@ +using Avalonia; + +namespace HandyControl.Controls; + +public class InfoElement +{ + public static readonly AttachedProperty NecessaryProperty = + AvaloniaProperty.RegisterAttached("Necessary", inherits: true); + + public static void SetNecessary(AvaloniaObject element, bool value) => element.SetValue(NecessaryProperty, value); + + public static bool GetNecessary(AvaloniaObject element) => element.GetValue(NecessaryProperty); + + public static readonly AttachedProperty SymbolProperty = + AvaloniaProperty.RegisterAttached("Symbol", inherits: true); + + public static void SetSymbol(AvaloniaObject element, object value) => element.SetValue(SymbolProperty, value); + + public static object GetSymbol(AvaloniaObject element) => element.GetValue(SymbolProperty); + + public static readonly AttachedProperty ContentHeightProperty = + AvaloniaProperty.RegisterAttached("ContentHeight", defaultValue: 28, + inherits: true); + + public static void SetContentHeight(AvaloniaObject element, double value) => + element.SetValue(ContentHeightProperty, value); + + public static double GetContentHeight(AvaloniaObject element) => element.GetValue(ContentHeightProperty); + + public static readonly AttachedProperty MinContentHeightProperty = + AvaloniaProperty.RegisterAttached("MinContentHeight", defaultValue: 28, + inherits: true); + + public static void SetMinContentHeight(AvaloniaObject element, double value) => + element.SetValue(MinContentHeightProperty, value); + + public static double GetMinContentHeight(AvaloniaObject element) => element.GetValue(MinContentHeightProperty); + + public static readonly AttachedProperty MaxContentHeightProperty = + AvaloniaProperty.RegisterAttached("MaxContentHeight", + defaultValue: double.PositiveInfinity); + + public static void SetMaxContentHeight(AvaloniaObject element, double value) => + element.SetValue(MaxContentHeightProperty, value); + + public static double GetMaxContentHeight(AvaloniaObject element) => element.GetValue(MaxContentHeightProperty); + + public static readonly AttachedProperty RegexPatternProperty = + AvaloniaProperty.RegisterAttached("RegexPattern"); + + public static void SetRegexPattern(AvaloniaObject element, string value) => + element.SetValue(RegexPatternProperty, value); + + public static string GetRegexPattern(AvaloniaObject element) => element.GetValue(RegexPatternProperty); + + public static readonly AttachedProperty ShowClearButtonProperty = + AvaloniaProperty.RegisterAttached("ShowClearButton"); + + public static void SetShowClearButton(AvaloniaObject element, bool value) => + element.SetValue(ShowClearButtonProperty, value); + + public static bool GetShowClearButton(AvaloniaObject element) => element.GetValue(ShowClearButtonProperty); +} diff --git a/src/Avalonia/HandyControl_Avalonia/Controls/Attach/TextBlockAttach.cs b/src/Avalonia/HandyControl_Avalonia/Controls/Attach/TextBlockAttach.cs new file mode 100644 index 00000000..1fdf0f16 --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Controls/Attach/TextBlockAttach.cs @@ -0,0 +1,53 @@ +using Avalonia; +using Avalonia.Controls; + +namespace HandyControl.Controls; + +public class TextBlockAttach +{ + public static readonly AttachedProperty AutoTooltipProperty = + AvaloniaProperty.RegisterAttached("AutoTooltip", defaultValue: false); + + public static void SetAutoTooltip(AvaloniaObject element, bool value) => + element.SetValue(AutoTooltipProperty, value); + + public static bool GetAutoTooltip(AvaloniaObject element) => element.GetValue(AutoTooltipProperty); + + static TextBlockAttach() + { + AutoTooltipProperty.Changed.AddClassHandler(OnAutoTooltipChanged); + } + + private static void OnAutoTooltipChanged(AvaloniaObject d, AvaloniaPropertyChangedEventArgs e) + { + if (d is not TextBlock ctl) + { + return; + } + + if (e.GetNewValue()) + { + UpdateTooltip(ctl); + ctl.SizeChanged += TextBlock_SizeChanged; + } + else + { + ctl.SizeChanged -= TextBlock_SizeChanged; + } + } + + private static void TextBlock_SizeChanged(object? sender, SizeChangedEventArgs e) + { + if (sender is TextBlock textBlock) + { + UpdateTooltip(textBlock); + } + } + + private static void UpdateTooltip(TextBlock textBlock) + { + textBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); + double width = textBlock.DesiredSize.Width - textBlock.Margin.Left - textBlock.Margin.Right; + ToolTip.SetTip(textBlock, textBlock.Bounds.Width > width ? textBlock.Text : null); + } +} diff --git a/src/Avalonia/HandyControl_Avalonia/Controls/Attach/TitleElement.cs b/src/Avalonia/HandyControl_Avalonia/Controls/Attach/TitleElement.cs index fcf44593..cbd64b02 100644 --- a/src/Avalonia/HandyControl_Avalonia/Controls/Attach/TitleElement.cs +++ b/src/Avalonia/HandyControl_Avalonia/Controls/Attach/TitleElement.cs @@ -1,17 +1,19 @@ using Avalonia; +using Avalonia.Controls; +using Avalonia.Layout; using Avalonia.Media; +using HandyControl.Data; namespace HandyControl.Controls; public class TitleElement { - public static readonly AttachedProperty BorderBrushProperty = - AvaloniaProperty.RegisterAttached("BorderBrush", inherits: true); + public static readonly AttachedProperty TitleProperty = + AvaloniaProperty.RegisterAttached("Title"); - public static void SetBorderBrush(AvaloniaObject element, IBrush? value) => - element.SetValue(BorderBrushProperty, value); + public static void SetTitle(AvaloniaObject element, string value) => element.SetValue(TitleProperty, value); - public static IBrush? GetBorderBrush(AvaloniaObject element) => element.GetValue(BorderBrushProperty); + public static string GetTitle(AvaloniaObject element) => element.GetValue(TitleProperty); public static readonly AttachedProperty BackgroundProperty = AvaloniaProperty.RegisterAttached("Background", inherits: true); @@ -28,4 +30,81 @@ public class TitleElement element.SetValue(ForegroundProperty, value); public static IBrush? GetForeground(AvaloniaObject element) => element.GetValue(ForegroundProperty); + + public static readonly AttachedProperty BorderBrushProperty = + AvaloniaProperty.RegisterAttached("BorderBrush", inherits: true); + + public static void SetBorderBrush(AvaloniaObject element, IBrush? value) => + element.SetValue(BorderBrushProperty, value); + + public static IBrush? GetBorderBrush(AvaloniaObject element) => element.GetValue(BorderBrushProperty); + + public static readonly AttachedProperty TitlePlacementProperty = + AvaloniaProperty.RegisterAttached("TitlePlacement", + defaultValue: TitlePlacementType.Top, inherits: true); + + public static void SetTitlePlacement(AvaloniaObject element, TitlePlacementType value) => + element.SetValue(TitlePlacementProperty, value); + + public static TitlePlacementType GetTitlePlacement(AvaloniaObject element) => + element.GetValue(TitlePlacementProperty); + + public static readonly AttachedProperty TitleWidthProperty = + AvaloniaProperty.RegisterAttached("TitleWidth", + defaultValue: GridLength.Auto, inherits: true); + + public static void SetTitleWidth(AvaloniaObject element, GridLength value) => + element.SetValue(TitleWidthProperty, value); + + public static GridLength GetTitleWidth(AvaloniaObject element) => element.GetValue(TitleWidthProperty); + + public static readonly AttachedProperty HorizontalAlignmentProperty = + AvaloniaProperty.RegisterAttached("HorizontalAlignment", + inherits: true); + + public static void SetHorizontalAlignment(AvaloniaObject element, HorizontalAlignment value) => + element.SetValue(HorizontalAlignmentProperty, value); + + public static HorizontalAlignment GetHorizontalAlignment(AvaloniaObject element) => + element.GetValue(HorizontalAlignmentProperty); + + public static readonly AttachedProperty VerticalAlignmentProperty = + AvaloniaProperty.RegisterAttached("VerticalAlignment", + inherits: true); + + public static void SetVerticalAlignment(AvaloniaObject element, VerticalAlignment value) => + element.SetValue(VerticalAlignmentProperty, value); + + public static VerticalAlignment GetVerticalAlignment(AvaloniaObject element) => + element.GetValue(VerticalAlignmentProperty); + + public static readonly AttachedProperty MarginOnTheLeftProperty = + AvaloniaProperty.RegisterAttached("MarginOnTheLeft", inherits: true); + + public static void SetMarginOnTheLeft(AvaloniaObject element, Thickness value) => + element.SetValue(MarginOnTheLeftProperty, value); + + public static Thickness GetMarginOnTheLeft(AvaloniaObject element) => element.GetValue(MarginOnTheLeftProperty); + + public static readonly AttachedProperty MarginOnTheTopProperty = + AvaloniaProperty.RegisterAttached("MarginOnTheTop", inherits: true); + + public static void SetMarginOnTheTop(AvaloniaObject element, Thickness value) => + element.SetValue(MarginOnTheTopProperty, value); + + public static Thickness GetMarginOnTheTop(AvaloniaObject element) => element.GetValue(MarginOnTheTopProperty); + + public static readonly AttachedProperty MinHeightProperty = + AvaloniaProperty.RegisterAttached("MinHeight"); + + public static void SetMinHeight(AvaloniaObject element, double value) => element.SetValue(MinHeightProperty, value); + + public static double GetMinHeight(AvaloniaObject element) => element.GetValue(MinHeightProperty); + + public static readonly AttachedProperty MinWidthProperty = + AvaloniaProperty.RegisterAttached("MinWidth"); + + public static void SetMinWidth(AvaloniaObject element, double value) => element.SetValue(MinWidthProperty, value); + + public static double GetMinWidth(AvaloniaObject element) => element.GetValue(MinWidthProperty); } diff --git a/src/Avalonia/HandyControl_Avalonia/Data/Enum/TitlePlacementType.cs b/src/Avalonia/HandyControl_Avalonia/Data/Enum/TitlePlacementType.cs new file mode 100644 index 00000000..9bea72f7 --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Data/Enum/TitlePlacementType.cs @@ -0,0 +1,7 @@ +namespace HandyControl.Data; + +public enum TitlePlacementType +{ + Left, + Top +} diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Brushes.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Brushes.axaml index 128a6002..7a1c695f 100644 --- a/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Brushes.axaml +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Brushes.axaml @@ -107,6 +107,8 @@ + #f8491e #f8491e + #783399FF #20000000 #40000000 2583691263 @@ -90,6 +91,7 @@ #ff5722 #d43f3a + #783399FF #40000000 #40000000 2583691263 diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Converters.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Converters.axaml index 3479351b..578e09ee 100644 --- a/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Converters.axaml +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Basic/Converters.axaml @@ -9,6 +9,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia/HandyControl_Avalonia/Themes/Theme.axaml b/src/Avalonia/HandyControl_Avalonia/Themes/Theme.axaml index 69ed8848..78f68c95 100644 --- a/src/Avalonia/HandyControl_Avalonia/Themes/Theme.axaml +++ b/src/Avalonia/HandyControl_Avalonia/Themes/Theme.axaml @@ -35,6 +35,7 @@ + diff --git a/src/Avalonia/HandyControl_Avalonia/Tools/Converter/Double2GridLengthConverter.cs b/src/Avalonia/HandyControl_Avalonia/Tools/Converter/Double2GridLengthConverter.cs new file mode 100644 index 00000000..9559edb3 --- /dev/null +++ b/src/Avalonia/HandyControl_Avalonia/Tools/Converter/Double2GridLengthConverter.cs @@ -0,0 +1,29 @@ +using System; +using System.Globalization; +using Avalonia.Controls; +using Avalonia.Data.Converters; + +namespace HandyControl.Tools.Converter; + +public class Double2GridLengthConverter : IValueConverter +{ + public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture) + { + if (value is not double doubleValue) + { + return new GridLength(0); + } + + if (double.IsNaN(doubleValue) || double.IsInfinity(doubleValue)) + { + return new GridLength(1.0, GridUnitType.Star); + } + + return new GridLength(doubleValue); + } + + public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture) + { + throw new NotSupportedException(); + } +} diff --git a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.cs.resx b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.cs.resx index 377e59b9..2731d1b2 100644 --- a/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.cs.resx +++ b/src/Shared/HandyControlDemo_Shared/Properties/Langs/Lang.cs.resx @@ -1,17 +1,17 @@  - @@ -669,8 +669,8 @@ HatchBrushGenerator - - Morphing Animation + + MorphingAnimation Divider @@ -810,4 +810,4 @@ ConfettiCannon - \ No newline at end of file + diff --git a/src/Shared/HandyControl_Shared/Controls/Attach/InfoElement.cs b/src/Shared/HandyControl_Shared/Controls/Attach/InfoElement.cs index c00263ae..a0310ae9 100644 --- a/src/Shared/HandyControl_Shared/Controls/Attach/InfoElement.cs +++ b/src/Shared/HandyControl_Shared/Controls/Attach/InfoElement.cs @@ -9,7 +9,7 @@ public class InfoElement : TitleElement /// 占位符 /// public static readonly DependencyProperty PlaceholderProperty = DependencyProperty.RegisterAttached( - "Placeholder", typeof(string), typeof(InfoElement), new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.Inherits)); + "Placeholder", typeof(string), typeof(InfoElement), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits)); public static void SetPlaceholder(DependencyObject element, string value) => element.SetValue(PlaceholderProperty, value); @@ -29,7 +29,7 @@ public class InfoElement : TitleElement /// 标记 /// public static readonly DependencyProperty SymbolProperty = DependencyProperty.RegisterAttached( - "Symbol", typeof(string), typeof(InfoElement), new FrameworkPropertyMetadata(default(string), FrameworkPropertyMetadataOptions.Inherits)); + "Symbol", typeof(string), typeof(InfoElement), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits)); public static void SetSymbol(DependencyObject element, string value) => element.SetValue(SymbolProperty, value); diff --git a/src/Shared/HandyControl_Shared/Controls/Attach/TitleElement.cs b/src/Shared/HandyControl_Shared/Controls/Attach/TitleElement.cs index 3d47bfaf..b2638b1d 100644 --- a/src/Shared/HandyControl_Shared/Controls/Attach/TitleElement.cs +++ b/src/Shared/HandyControl_Shared/Controls/Attach/TitleElement.cs @@ -16,7 +16,7 @@ public class TitleElement => (string) element.GetValue(TitleProperty); public static readonly DependencyProperty BackgroundProperty = DependencyProperty.RegisterAttached( - "Background", typeof(Brush), typeof(TitleElement), new FrameworkPropertyMetadata(default(Brush), FrameworkPropertyMetadataOptions.Inherits)); + "Background", typeof(Brush), typeof(TitleElement), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits)); public static void SetBackground(DependencyObject element, Brush value) => element.SetValue(BackgroundProperty, value); @@ -25,7 +25,7 @@ public class TitleElement => (Brush) element.GetValue(BackgroundProperty); public static readonly DependencyProperty ForegroundProperty = DependencyProperty.RegisterAttached( - "Foreground", typeof(Brush), typeof(TitleElement), new FrameworkPropertyMetadata(default(Brush), FrameworkPropertyMetadataOptions.Inherits)); + "Foreground", typeof(Brush), typeof(TitleElement), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits)); public static void SetForeground(DependencyObject element, Brush value) => element.SetValue(ForegroundProperty, value); @@ -34,7 +34,7 @@ public class TitleElement => (Brush) element.GetValue(ForegroundProperty); public static readonly DependencyProperty BorderBrushProperty = DependencyProperty.RegisterAttached( - "BorderBrush", typeof(Brush), typeof(TitleElement), new FrameworkPropertyMetadata(default(Brush), FrameworkPropertyMetadataOptions.Inherits)); + "BorderBrush", typeof(Brush), typeof(TitleElement), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits)); public static void SetBorderBrush(DependencyObject element, Brush value) => element.SetValue(BorderBrushProperty, value);