2011-07-02 6 views
3

두 가지 다른보기에서 사용되는 DataGrid가 있습니다. 각 경우에 사용자가 호스트 컨트롤/뷰의 크기를 조절하면 마지막 열의 너비를 조정할 수 있습니다.데이터 격자의 마지막 열 크기를 조정합니다.

어떻게 하시겠습니까?

건배,
Berryl

>

<DataGrid.Columns> 
     <DataGridTextColumn 
      Header="Number" Binding="{Binding BusinessId}" IsReadOnly="True" 
      CanUserSort="True" CanUserResize="False" 
      Width="75"/> 
     <DataGridTextColumn 
      Header="Description" Binding="{Binding Description}" IsReadOnly="True" 
      CanUserSort="True" SortDirection="Ascending" CanUserResize="True" 
      MinWidth="260" Width="Auto" /> 
    </DataGrid.Columns> 

</DataGrid> 

UPDATE (작업 코드)

난 그냥 이름

... CanUserResizeColumns = "참" xaml의 열 코드 숨김에 다음 코드를 삽입하십시오. 누구나 더 나은 아이디어 나이를 최적화 할 수있는 방법이 있다면 알려 주시기 바랍니다.

public partial class Listing : UserControl 
{ 
    private double _currentColumnWidth; 

    public Listing() 
    { 
     InitializeComponent(); 

     Loaded += OnLoaded; 
     SizeChanged += OnSizeChanged; 
    } 

    private void OnLoaded(object sender, RoutedEventArgs e) 
    { 
     _currentColumnWidth = colDescription.ActualWidth; 
    } 

    private void OnSizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     // split if control is not loaded yet 
     if (_currentColumnWidth == 0) return; 

     // only interested in width, not height 
     var widthChanged = e.WidthChanged; 
     if (!widthChanged) return; 

     var delta = e.NewSize.Width - e.PreviousSize.Width; 
     var newWidth = _currentColumnWidth + delta; 
     if (newWidth <= colDescription.MinWidth || newWidth >= colDescription.MaxWidth) return; 

     _currentColumnWidth = newWidth; 
     colDescription.Width = new DataGridLength(_currentColumnWidth); 
    } 
} 

답변

2

쉬운, 그냥 ... 당신의 XAML

<DataGridTextColumn 
       Header="Description" Binding="{Binding Description}" 
       IsReadOnly="True" 
       CanUserSort="True" SortDirection="Ascending" CanUserResize="True" 
       MinWidth="260" Width="Auto" /> 

에 폭 속성을 대체

<DataGridTextColumn 
       Header="Description" Binding="{Binding Description}" IsReadOnly="True" 
       CanUserSort="True" SortDirection="Ascending" CanUserResize="True" 
       MinWidth="260" Width="*" /> 

당신은 폭의 처리를 할 뒤에 코드를 필요로하지 않는다 WPF는 XAML에서이를 지원합니다.

은 "*"나는 내 원래의 게시물 '갱신'의 코드를 단순화하고 있었다 버그를 고정 된 크기 조정 값 :

+0

이것은 내가 한 것입니다. – gjvdkamp

+0

@ Jason Ebersey. *와 Auto는 둘 다 자동 크기 조정 기능을 가지고 있습니다. 차이점은 Star가 "사용 가능한 공간의 가중치 비율에 따라 자동으로 크기를 조정합니다."반면 자동은 셀과 열 머리글의 내용을 기반으로 요소의 크기를 자동으로 조정합니다. 그리드가 Window에서 컨트롤 일 뿐이라면 솔루션이 완벽하게 작동한다고 생각하지만, 다른보기 컨테이너에서 호스팅되는 UserControl 내부에서 호스팅되는 열은 동기화되지 않습니다. – Berryl

+0

아마 내가 질문을 할 때 그런 상황이 내가 tho를 해결하기 위해 찾고있는 상황이라는 것을 분명히하지 않았으므로 이것을 답으로 표시 할 것입니다! 건배 – Berryl

1

을 나타냅니다. 제이슨의 제안은 "*"크기 조정을 사용하는 것이 더 간단하므로 그리드 자체가 UserControl 내부에 있지 않을 때 사용해야하지만 UserControl 내부에있을 때 열의 크기를 적절하게 유지하는 더 좋은 방법을 알지 못합니다.

건배
Berryl

코드는 아래라는 데이터 그리드 (즉, dgProject) 및 명명 된 열이 있다고 가정 (예 colDescription) 컨트롤의 크기를 조정하면 크기가 조절 될 필요가있다.

public partial class Listing : UserControl 
{ 

    public Listing() 
    { 
     InitializeComponent(); 

     SizeChanged += OnSizeChanged; 
    } 

    private void OnSizeChanged(object sender, SizeChangedEventArgs e) 
    { 
     // split if control is not loaded yet 
     if (!dgProject.IsLoaded) return; 

     // only interested in width, not height 
     if (!e.WidthChanged) return; 

     var delta = e.NewSize.Width - e.PreviousSize.Width; 
     var newWidth = colDescription.ActualWidth + delta; 
     if (newWidth <= colDescription.MinWidth || newWidth >= colDescription.MaxWidth) return; 

     colDescription.Width = new DataGridLength(newWidth); 
    } 
관련 문제