c# - 数据网格行标题未根据内容调整大小
问题描述
我正在自定义一个 DataGrid,以便用户可以通过 TextBox 将信息直接输入到标题中。
我遇到的问题是,当文本更改时,行标题没有调整大小以匹配内容的大小:
如您所见,一旦文本框的大小减小以匹配新文本,标题不会减小以匹配文本框。
符合最低限度、完整和可验证的示例要求:
<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>
在任何行标题中键入一些内容。然后清除它以重现。
那么我能做些什么来强制行标题宽度并确保它保持可能的最小宽度(不侵犯实际的行标题内容)?
解决方案
您可以处理元素的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>
推荐阅读
- javascript - 如何在按钮单击时使用 javascript 增加 div 高度?
- c# - ASP.NET 5 每个路由、应用程序部分或功能使用不同的服务容器
- python - django:第 8 行的块标记无效:'endblock'。您是否忘记注册或加载此标签?
- git - 为什么 git diff 和 git show 似乎用空格替换制表符?
- android - 从最近的背景中删除应用程序后,应用程序中的暗模式未应用
- c - `0+ptr`(0 加上一个指针)是什么意思?
- c# - Blazor asp.net 核心托管应用程序未将部分类注册到其 razor 组件
- vba - VBA - 在 IF 中添加名称
- blazor - 如何将元素作为参数传递给函数
- c++ - 带有自定义删除器的 std::shared_ptr?