在WPF数据网格中展开行
问题描述:
我正在使用DataGrid显示一些日志文件,其中每个单元格都包含一个TextBlock。我需要帮助创建一个方法来扩展用户选择的行这样的:在WPF数据网格中展开行
这是我的代码现在。它是基于点击的行的索引:
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>
如果你不喜欢默认的扩展一下,就可以覆盖它的模板看起来像一个普通的TextBlock
作为一个侧面说明,伸展和垂直对齐DataGridRow,你要舒展并对齐单元格内容,而不是行。
答
我试过一个扩展器,功能正是我想要的,但是外观并不是如此。我尝试重新设置Expander以适合我的需要,但因为需要添加的事件而放弃(XamlReader + events比我的编程技能可以处理的更多)。但基于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>
在代码隐藏然后我可以处理该事件“StackPanel_MouseUp”改变的TextBlocks的知名度。这个控件的外观和工作方式就像我想要的重新扩展器一样。
现在我的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 + "\"");
我喜欢用伪装成一个TextBlock扩展器控制的想法,但是我不知道该怎么做,不破坏扩展的功能 - 我不想文本多次有(如首标和扩展区域中的第一行)。 –
@ChristianOlling当扩展器展开时,您始终可以将标题的可见性设置为折叠状态,而WPF将只加载一个TextBlock或另一个TextBlock。您可以在这里找到WPF控件的默认模板:http://msdn.microsoft.com/en-us/library/aa970773.aspx。我也只是想,也许你可以添加一个'Click'事件到'TextBlock',它将'TextWrapping'设置为'Wrap'或'NoWrap' – Rachel