فهرست منبع

avalonia: added images to ImageCoulmn Headers

Kenric Nugteren 3 ماه پیش
والد
کامیت
861861ea39

+ 58 - 0
InABox.Avalonia/Components/AvaloniaDataGrid/AvaloniaDataGrid.axaml

@@ -50,6 +50,64 @@
 					</Style>
 					<Style Selector="DataGridColumnHeader">
 						<Setter Property="FontSize" Value="{StaticResource PrsFontSizeExtraSmall}"/>
+						<Setter Property="Padding" Value="0"/>
+						<Setter Property="Template">
+							<ControlTemplate>
+								<Border x:Name="HeaderBorder"
+										Background="{TemplateBinding Background}"
+										BorderBrush="{TemplateBinding BorderBrush}"
+										BorderThickness="{TemplateBinding BorderThickness}"
+										CornerRadius="{TemplateBinding CornerRadius}">
+									<Grid Name="PART_ColumnHeaderRoot" ColumnDefinitions="*,Auto">
+										<Panel Margin="{TemplateBinding Padding}"
+											   HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
+											   VerticalAlignment="{TemplateBinding VerticalContentAlignment}">
+											<Grid>
+												<Grid.ColumnDefinitions>
+													<ColumnDefinition Width="*" />
+													<ColumnDefinition Width="Auto" MinWidth="0" />
+												</Grid.ColumnDefinitions>
+												<ContentPresenter x:Name="PART_ContentPresenter"
+																  Content="{TemplateBinding Content}"
+																  ContentTemplate="{TemplateBinding ContentTemplate}" />
+												<Path Name="SortIcon"
+													  IsVisible="False"
+													  Grid.Column="1"
+													  Height="12"
+													  HorizontalAlignment="Center"
+													  VerticalAlignment="Center"
+													  Fill="{TemplateBinding Foreground}"
+													  Stretch="Uniform" />
+											</Grid>
+										</Panel>
+										<Rectangle Name="VerticalSeparator"
+												   Grid.Column="1"
+												   Width="1"
+												   VerticalAlignment="Stretch"
+												   Fill="{TemplateBinding SeparatorBrush}"
+												   IsVisible="{TemplateBinding AreSeparatorsVisible}" />
+										<Grid x:Name="FocusVisual" IsHitTestVisible="False"
+											  IsVisible="False">
+											<Rectangle x:Name="FocusVisualPrimary"
+													   HorizontalAlignment="Stretch"
+													   VerticalAlignment="Stretch"
+													   Fill="Transparent"
+													   IsHitTestVisible="False"
+													   Stroke="{DynamicResource DataGridCellFocusVisualPrimaryBrush}"
+													   StrokeThickness="2" />
+											<Rectangle x:Name="FocusVisualSecondary"
+													   Margin="2"
+													   HorizontalAlignment="Stretch"
+													   VerticalAlignment="Stretch"
+													   Fill="Transparent"
+													   IsHitTestVisible="False"
+													   Stroke="{DynamicResource DataGridCellFocusVisualSecondaryBrush}"
+													   StrokeThickness="1" />
+										</Grid>
+									</Grid>
+								</Border>
+							</ControlTemplate>
+						</Setter>
 					</Style>
 					<Style Selector="DataGridCell">
 						<Setter Property="FontSize" Value="{StaticResource PrsFontSizeExtraSmall}"/>

+ 15 - 0
InABox.Avalonia/Components/AvaloniaDataGrid/Columns/AvaloniaDataGridColumn.cs

@@ -1,4 +1,5 @@
 using Avalonia.Controls;
+using Avalonia.Controls.Converters;
 using Avalonia.Controls.Templates;
 using Avalonia.Data;
 using Avalonia.Layout;
@@ -43,6 +44,20 @@ public abstract class AvaloniaDataGridColumn<TEntity, TType> : AvaloniaDataGridC
     {
         var result = new TColumn();
         result.Header = Caption.NotWhiteSpaceOr(ColumnName);
+        result.HeaderTemplate = new FuncDataTemplate<object?>((value, scope) =>
+        {
+            return new TextBlock
+            {
+                Text = value?.ToString(),
+                TextAlignment = Alignment,
+                Margin = Alignment switch
+                {
+                    TextAlignment.Center => new(0, 0, 0, 0),
+                    TextAlignment.Right => new(0, 0, 12, 0),
+                    TextAlignment.Left or TextAlignment.Start or _ => new(12, 0, 0, 0),
+                }
+            };
+        });
         if(result is DataGridBoundColumn bound)
         {
             bound.Binding = new Binding(ColumnName, BindingMode.OneWay);

+ 16 - 0
InABox.Avalonia/Components/AvaloniaDataGrid/Columns/AvaloniaDataGridImageColumn.cs

@@ -17,6 +17,10 @@ public class AvaloniaDataGridImageColumn<TEntity> : AvaloniaDataGridColumn<TEnti
 
     public double Margin { get; set; }
 
+    public IImage? Header { get; set; }
+
+    public Stretch Stretch { get; set; } = Stretch.Uniform;
+
     public override DataGridColumn CreateColumn()
     {
         var column = CreateColumn<DataGridTemplateColumn>();
@@ -25,8 +29,20 @@ public class AvaloniaDataGridImageColumn<TEntity> : AvaloniaDataGridColumn<TEnti
             var image = new Image();
             image.Bind(Image.SourceProperty, new Binding(ColumnName));
             image.Margin = new(Margin);
+            image.Stretch = Stretch;
             return image;
         });
+        if(Header is not null)
+        {
+            column.HeaderTemplate = new FuncDataTemplate<object?>((value, scope) =>
+            {
+                var image = new Image();
+                image.Source = Header;
+                image.Stretch = Stretch;
+                image.Margin = new(Margin);
+                return image;
+            });
+        }
         return column;
     }