Estoy personalizando un DataGrid para que el usuario pueda ingresar información directamente en el encabezado a través de un TextBox.
El problema que tengo es que los encabezados de fila no cambian de tamaño para coincidir con el tamaño del contenido cuando cambia el texto:
Como puede ver, el tamaño del encabezado no se reduce para coincidir con los cuadros de texto una vez que el tamaño del cuadro de texto se ha reducido para que coincida con el nuevo texto.
De acuerdo con los requisitos de ejemplo mínimos, completos y verificables :
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:l="clr-namespace:MCVE"
xmlns:lib="clr-namespace:System;assembly=mscorlib"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
x:Class="MCVE.MainWindow"
mc:Ignorable="d" Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<x:Array x:Key="Source" Type="{x:Type lib:String}">
<lib:String>Foo</lib:String>
<lib:String>Bar</lib:String>
<lib:String>Baz</lib:String>
</x:Array>
</Window.Resources>
<DataGrid
AutoGenerateColumns="False"
ItemsSource="{StaticResource Source}"
RowHeight="50">
<DataGrid.RowHeaderStyle>
<Style TargetType="{x:Type DataGridRowHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<TextBox FontSize="36" HorizontalAlignment="Left" Text="This Is A Test" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.RowHeaderStyle>
</DataGrid>
</Window>
Escriba algunas cosas en cualquiera de los encabezados de fila. Luego, límpialo para reproducirlo.
Entonces, ¿qué puedo hacer para hacer cumplir el ancho del encabezado de la fila y asegurarme de que mantiene el ancho más pequeño posible (sin invadir el contenido real del encabezado de la fila)?
Puede manejar el SizeChanged
evento para los TextBox
elementos y realizar un seguimiento de su ancho. Prueba esto:
private readonly Dictionary<TextBox, double> _widths = new Dictionary<TextBox, double>();
private void TextBox_SizeChanged(object sender, SizeChangedEventArgs e)
{
TextBox textBox = (TextBox)sender;
_widths[textBox] = textBox.ActualWidth;
double largestWidth = _widths.Values.Max();
DataGridRowHeader header = FindParent<DataGridRowHeader>(textBox);
dg.RowHeaderWidth = double.NaN;
if (header != null)
dg.RowHeaderWidth = dg.RowHeaderActualWidth > largestWidth ? largestWidth : double.NaN;
}
XAML:
<DataGrid.RowHeaderStyle>
<Style TargetType="{x:Type DataGridRowHeader}">
<Setter Property="Width" Value="Auto" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<TextBox FontSize="36" HorizontalAlignment="Left" Text="This Is A Test"
SizeChanged="TextBox_SizeChanged" />
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGrid.RowHeaderStyle>
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras