Заголовок строки таблицы данных не изменяется в соответствии с содержимым - PullRequest
0 голосов
/ 30 апреля 2018

Я настраиваю DataGrid, чтобы пользователь мог вводить информацию непосредственно в заголовок через TextBox.

Проблема, с которой я сталкиваюсь, заключается в том, что заголовки строк не меняются, чтобы соответствовать размеру содержимого при изменении текста:

Перед тем: enter image description here

После того, как: enter image description here enter image description here

Как видите, заголовок не уменьшается в размере, чтобы соответствовать текстовым полям, как только размер текстового поля был уменьшен для соответствия новому тексту.

В соответствии с Минимальным, полным и проверяемым примером Требования:

<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>

Введите некоторые вещи в любой из заголовков строк. Затем очистите его для воспроизведения.

Так, что я могу сделать, чтобы обеспечить ширину заголовка строки и убедиться, что она поддерживает наименьшую возможную ширину (без посягательства на фактическое содержимое заголовка строки)?

1 Ответ

0 голосов
/ 30 апреля 2018

Вы можете обработать событие SizeChanged для элементов TextBox и отслеживать их ширину. Попробуйте это:

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>
...