2011-11-17 72 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 + "\"");