瀏覽代碼

feat: use visual brush if Header is control. (#18154)

Dong Bin 8 月之前
父節點
當前提交
daf3d5805b
共有 1 個文件被更改,包括 33 次插入2 次删除
  1. 33 2
      src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs

+ 33 - 2
src/Avalonia.Controls.DataGrid/DataGridColumnHeader.cs

@@ -12,6 +12,8 @@ using Avalonia.Collections;
 using Avalonia.Controls.Automation.Peers;
 using Avalonia.Controls.Metadata;
 using Avalonia.Controls.Mixins;
+using Avalonia.Controls.Shapes;
+using Avalonia.Controls.Templates;
 using Avalonia.Controls.Utils;
 using Avalonia.Data;
 using Avalonia.Input;
@@ -678,8 +680,7 @@ namespace Avalonia.Controls
             {
                 OwningColumn = OwningColumn,
                 IsEnabled = false,
-                Content = Content,
-                ContentTemplate = ContentTemplate
+                Content = GetDragIndicatorContent(Content, ContentTemplate)
             };
             if (OwningGrid.ColumnHeaderTheme is { } columnHeaderTheme)
             {
@@ -725,6 +726,36 @@ namespace Avalonia.Controls
             }
         }
 
+        private object GetDragIndicatorContent(object content, IDataTemplate? dataTemplate)
+        {
+            if (content is ContentControl icc)
+            {
+                content = icc.Content;
+            }
+
+            if (content is Control control)
+            {
+                if (VisualRoot == null) return content;
+                control.Measure(Size.Infinity);
+                var rect = new Rectangle()
+                {
+                    Width = control.DesiredSize.Width,
+                    Height = control.DesiredSize.Height,
+                    Fill = new VisualBrush
+                    {
+                        Visual = control, Stretch = Stretch.None, AlignmentX = AlignmentX.Left,
+                    }
+                };
+                return rect;
+            }
+
+            if (dataTemplate is not null)
+            {
+                return dataTemplate.Build(content);
+            }
+            return content;
+        }
+
         //TODO DragEvents
         private void OnMouseMove_Reorder(ref bool handled, Point mousePosition, Point mousePositionHeaders)
         {