C# 展开WPF数据网格中的行

C# 展开WPF数据网格中的行,c#,wpf,wpfdatagrid,C#,Wpf,Wpfdatagrid,我使用DataGrid显示一些日志文件,其中每个单元格包含一个文本块。我需要帮助创建一个方法来展开用户选择的行,如下所示: 这是我现在的代码。它基于单击行的索引: DataGridRow testrow = (DataGridRow)logBrowserDataGrid.ItemContainerGenerator.ContainerFromIndex(index); logBrowserDataGrid.UpdateLayout(); logBrowserDataGrid.ScrollIn

我使用DataGrid显示一些日志文件,其中每个单元格包含一个文本块。我需要帮助创建一个方法来展开用户选择的行,如下所示:

这是我现在的代码。它基于单击行的索引:

DataGridRow testrow = (DataGridRow)logBrowserDataGrid.ItemContainerGenerator.ContainerFromIndex(index);

logBrowserDataGrid.UpdateLayout();
logBrowserDataGrid.ScrollIntoView(logBrowserDataGrid.Items[index]);

testrow = (DataGridRow)logBrowserDataGrid.ItemContainerGenerator.ContainerFromIndex(index);
testrow.Height = 100;
然而,这产生了一个奇怪的结果:

您知道一种基于索引展开行的方法吗

你知道我得到的奇怪结果是什么吗?看起来我正在扩大这一行的一部分,而其余的部分确实在伸展。我也在运行时研究过它,可以看到它的高度是正确的100,但实际高度仍然是20

其他信息: 行的默认大小由DataGrid上的.RowHeight属性设置。
我正在使用AutoGenerateColumns功能,并捕获AutogeneratingColumn事件以用DataGridTemplateColumn替换该列。

为什么不用扩展器替换默认DataGridCellTemplate来为您完成这一切

<DataGridColumn>
    <DataGridColumn.CellTemplate>
        <DataTemplate>
            <Expander Header="{Binding SomeText}">
                <TextBlock TextWrapping="Wrap" Text="{Binding SomeText}" />
            </Expander>
        </DataTemplate>
    </DataGridColumn.CellTemplate>
</DataGridColum>

如果您不喜欢默认的Expander外观,可以将其模板覆盖为普通文本块


作为旁注,要拉伸和垂直对齐DataGridRow,您需要拉伸和对齐单元格内容,而不是行。

我尝试使用扩展器,功能正是我想要的,但外观不是。我曾尝试重新设置扩展器的样式以满足我的需要,但由于需要添加事件而放弃了(XamlReader+事件超出了我的编程技能所能处理的范围)。但根据Rachels的建议,我制作了一个包含以下内容的用户控件:

<StackPanel Orientation="Vertical" MouseUp="StackPanel_MouseUp">
   <TextBlock Name="headerTextBlock" Margin="3,2,3,2" Height="20" Width="Auto" TextWrapping="NoWrap"/>
   <TextBlock Name="textTextBlock" Margin="3,2,3,2" Height="Auto" Width="Auto" TextWrapping="NoWrap" Visibility="Collapsed"/>
</StackPanel>

在codebehind中,我可以处理事件“StackPanel_MouseUp”来更改文本块的可见性。此控件的外观和工作方式与我希望重新设计样式的扩展器的相同

现在我的xaml字符串看起来像这样

string xamlCellTemplateFormat =
         @"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
                         xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml""
                         ~local~>
                <local:CustomExpander x:Name=""UserControlTest"" Header=""{Binding Path=~binding~}"" Text=""{Binding Path=~binding~}""/>
           </DataTemplate>";

string xamlCellTemplate = xamlCellTemplateFormat.Replace("~binding~", e.Column.Header.ToString());
xamlCellTemplate = xamlCellTemplate.Replace("~local~", " xmlns:local=\"clr-namespace:IS.AppFramework.Windows.LogBrowserWPF;assembly=" + Assembly.GetExecutingAssembly().GetName().Name + "\"");
字符串xamlCellTemplateFormat=
@"
";
字符串xamlCellTemplate=xamlCellTemplateFormat.Replace(“~binding~”,例如Column.Header.ToString());
xamlCellTemplate=xamlCellTemplate.Replace(“~local~”,“xmlns:local=\”clr命名空间:IS.AppFramework.Windows.LogBrowserWPF;assembly=“+assembly.getExecutionGassembly().GetName().Name+“\”);

我喜欢将扩展器控件伪装成文本块的想法,但是我不知道如何在不破坏扩展器功能的情况下实现这一点-我不想让文本重复多次(例如,标题和扩展区域中的第一行)@ChristianOlling当扩展程序展开时,您始终可以将标题的可见性设置为折叠,WPF将只加载一个或另一个文本块。您可以在此处找到WPF控件的默认模板:。我还在想,也许你可以在
TextBlock
中添加一个
Click
事件,将
TextWrapping
设置为
Wrap
NoWrap