diff --git a/src/Avalonia/HandyControlDemo_Avalonia/Data/DemoInfo.json b/src/Avalonia/HandyControlDemo_Avalonia/Data/DemoInfo.json
index 5c507e64..d2c0eb21 100644
--- a/src/Avalonia/HandyControlDemo_Avalonia/Data/DemoInfo.json
+++ b/src/Avalonia/HandyControlDemo_Avalonia/Data/DemoInfo.json
@@ -47,6 +47,7 @@
[ "ProgressButton", "ProgressButtonDemo", "Brush.ProgressBarStatusBar8", "", "Button" ],
[ "Card", "CardDemo", "Brush.ContactCard", "", "DataDisplay" ],
[ "PinBox", "PinBoxDemo", "Brush.Ellipsis", "", "DataEntry" ],
+ [ "SearchBar", "SearchBarDemo", "Brush.Search", "", "DataEntry" ],
[ "ElementGroup", "ElementGroupDemo", "Brush.ButtonGroup", "", "Layout" ],
[ "CirclePanel", "CirclePanelDemo", "Brush.ColorWheel", "", "Layout" ],
[ "Grid", "GridDemo", "Brush.GridPane", "", "Layout" ],
diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/SearchBarDemo.axaml b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/SearchBarDemo.axaml
new file mode 100644
index 00000000..bd17ae08
--- /dev/null
+++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/SearchBarDemo.axaml
@@ -0,0 +1,144 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/SearchBarDemo.axaml.cs b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/SearchBarDemo.axaml.cs
new file mode 100644
index 00000000..861e4bd2
--- /dev/null
+++ b/src/Avalonia/HandyControlDemo_Avalonia/UserControl/Controls/SearchBarDemo.axaml.cs
@@ -0,0 +1,25 @@
+using Avalonia.Interactivity;
+using HandyControl.Controls;
+using HandyControl.Data;
+
+namespace HandyControlDemo.UserControl;
+
+public partial class SearchBarDemo : Avalonia.Controls.UserControl
+{
+ public SearchBarDemo()
+ {
+ InitializeComponent();
+ }
+
+ private void SearchBar_OnSearchStarted(object? sender, FunctionEventArgs e)
+ {
+ if (string.IsNullOrWhiteSpace(e.Info))
+ {
+ return;
+ }
+
+ var growlType = System.Type.GetType("HandyControl.Controls.Growl, HandyControl");
+ var method = growlType?.GetMethod("Info", [typeof(string), typeof(string)]);
+ method?.Invoke(null, [e.Info, string.Empty]);
+ }
+}
diff --git a/src/Avalonia/HandyControl_Avalonia/Controls/Input/SearchBar.cs b/src/Avalonia/HandyControl_Avalonia/Controls/Input/SearchBar.cs
new file mode 100644
index 00000000..61f24624
--- /dev/null
+++ b/src/Avalonia/HandyControl_Avalonia/Controls/Input/SearchBar.cs
@@ -0,0 +1,129 @@
+using System;
+using System.Windows.Input;
+using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Controls.Metadata;
+using Avalonia.Controls.Primitives;
+using Avalonia.Input;
+using Avalonia.Interactivity;
+using HandyControl.Data;
+
+namespace HandyControl.Controls;
+
+[TemplatePart(Name = ElementSearchButton, Type = typeof(Button))]
+public class SearchBar : TextBox
+{
+ private const string ElementSearchButton = "PART_SearchButton";
+
+ public static readonly RoutedEvent> SearchStartedEvent =
+ RoutedEvent.Register>(nameof(SearchStarted), RoutingStrategies.Bubble);
+
+ public static readonly StyledProperty IsRealTimeProperty =
+ AvaloniaProperty.Register(nameof(IsRealTime));
+
+ public static readonly StyledProperty CommandProperty =
+ AvaloniaProperty.Register(nameof(Command));
+
+ public static readonly StyledProperty