2011-11-17 73 views
3

我正在使用DataGrid显示一些日志文件,其中每个单元格都包含一个TextBlock。我需要帮助创建一个方法来扩展用户选择的行这样的:在WPF数据网格中展开行

http://dl.dropbox.com/u/5649690/StackOverflow%20-%20Do%20not%20delete/Expand%20row%20in%20wpf%20datagrid/Do%20want.png

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

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

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

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

但是这创造了一个怪异的结果:

http://dl.dropbox.com/u/5649690/StackOverflow%20-%20Do%20not%20delete/Expand%20row%20in%20wpf%20datagrid/Do%20not%20want%20.png

你知道神的方式来扩大基于索引的行?

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

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

回答

4

为什么不用一个扩展器替换默认的DataGridCellTemplate来为你做所有的事情?

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

如果你不喜欢默认的扩展一下,就可以覆盖它的模板看起来像一个普通的TextBlock

作为一个侧面说明,伸展和垂直对齐DataGridRow,你要舒展并对齐单元格内容,而不是行。

+0

我喜欢用伪装成一个TextBlock扩展器控制的想法,但是我不知道该怎么做,不破坏扩展的功能 - 我不想文本多次有(如首标和扩展区域中的第一行)。 –

+0

@ChristianOlling当扩展器展开时,您始终可以将标题的可见性设置为折叠状态,而WPF将只加载一个TextBlock或另一个TextBlock。您可以在这里找到WPF控件的默认模板:http://msdn.microsoft.com/en-us/library/aa970773.aspx。我也只是想,也许你可以添加一个'Click'事件到'TextBlock',它将'TextWrapping'设置为'Wrap'或'NoWrap' – Rachel

0

我试过一个扩展器,功能正是我想要的,但是外观并不是如此。我尝试重新设置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 + "\"");