2011-11-17 2 views
3

DataGrid를 사용하여 각 셀에 TextBlock이 포함 된 일부 로그 파일을 표시하고 있습니다.WPF DataGrid의 행 확장

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 볼 수 있지만 ActuallyHeight 여전히 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 또는 다른 하나만로드합니다. WPF 컨트롤의 기본 템플릿은 http://msdn.microsoft.com/en-us/library/aa970773.aspx에서 찾을 수 있습니다. 나는 또한 단지 TextBrapping에'Click' 이벤트를 추가하여 TextBrapping을'Wrap' 또는'NoWrap'으로 설정한다고 생각했습니다. – Rachel

0

익스팬더를 사용해 보았는데 기능이 정확히 내가 원했던 것이지만 모양은 그렇지 않았습니다. 익스팬더를 내 필요에 맞게 재구성하려고 시도했지만 추가해야하는 이벤트 때문에 포기했습니다 (XamlReader + 이벤트는 프로그래밍 기술이 처리 할 수있는 것 이상이었습니다). 코드 숨김 내가 다음 TextBlocks의 가시성을 변경하는 경우 "StackPanel_MouseUp"를 처리 할 수 ​​있습니다에서

<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> 

:하지만 라셀 (Rachels)의 제안에 따라 나는 다음과 같은 내용으로 UserControl을했다. 이 컨트롤은 외형의 Expander가해야 할 것처럼 보이고 작동합니다.

이제 내 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 + "\""); 
관련 문제