2013-04-09 1 views
6

UserControl에서 파생 된 항목이 포함 된 ListBox가 있습니다. 구체적 UserControl에는 DataGrid가 포함되어 있습니다. 기본적으로 구체적인 UserControl을 변경할 수 없습니다 (테스트 목적으로 만 변경, 타사의 종류). 전체 열을 채우기 위해 필요한 하나의 열 너비가 "*"로 설정되면 모든 열의 DataGrid 열 너비가 깨집니다.wpf ListBox의 Datagrid 열 너비가 잘못되었습니다.

간단한 예제 (UserControl 제외)로 재현 할 수 있습니다. 그래서 DataGrid를 ListBoxItem으로 추가하면 "*"의 열 너비를 지정하면 열 너비가 깨집니다. BTW, 더 이상 사용자가 열의 크기를 조정할 수 없습니다.

간단한 예 :

<Window x:Class="DataGridSpike.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ListBox HorizontalContentAlignment="Stretch" > 
     <!-- Column width is basically ok but only since not "*" --> 
     <DataGrid> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Column1"/> 
       <DataGridTextColumn Header="Column2"/> 
       <DataGridTextColumn Header="Column3"/> 
      </DataGrid.Columns> 
     </DataGrid> 

     <!-- Broken column width: --> 
     <DataGrid> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Column1"/> 
       <DataGridTextColumn Header="Column2" Width="*"/> 
       <DataGridTextColumn Header="Column3"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </ListBox> 
</Grid> 

사람이이 문제를 해결하는 방법을 알고 있나요?

감사합니다.

답변

2

내가 일하는 kludge을 발견했다. 나는 지금까지 다른 생각이 없습니다.

ListView에서 DataGrid를 래핑하고 ListView에서 모든 "장식"을 제거한 다음 GridViewColumn의 너비를 ListView의 ActualWidth에 바인딩했습니다. 어쩌면 ListView 이외의 일부 컨트롤도 작동합니다. ListView를 가지고 놀고 있었어. 간단한 테두리가 작동하지 않습니다.

여백은 어떤 식 으로든 조정해야하며 오른쪽에는 간격이 있습니다. 나는 제거하지 않습니다 (그러나 나는 그걸로 살 수 있습니다). DataGrid의 HorizontalScrollBarVisibility를 비활성화하지 않으면 마우스로 widow 너비를 드래그하는 동안 이상한 깜박임 고스트 가로 스크롤 막대가 나타납니다.

그래서 여기에 충분한 것으로 보이는 XAML이 있습니다. 실제 ListView kludge는 구체적인 UserControl의 일부가됩니다. 그러나, 다음 (간체) 코드는 내가 무슨 짓을했는지 보여줍니다

<Window x:Class="DataGridSpike.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ListBox HorizontalContentAlignment="Stretch"> 
      <!-- ListView is just a kludge --> 
      <ListView HorizontalContentAlignment="Stretch" Padding="-4,2,-10,0" BorderThickness="0"> 
       <ListView.View> 
        <GridView> 
         <GridView.ColumnHeaderContainerStyle> 
          <Style> 
           <Setter Property="FrameworkElement.Visibility" Value="Collapsed"/> 
          </Style> 
         </GridView.ColumnHeaderContainerStyle> 
         <GridViewColumn Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" /> 
        </GridView> 
       </ListView.View> 
       <DataGrid HorizontalContentAlignment="Stretch" HorizontalAlignment="Stretch" 
        Padding="-2,0" HorizontalScrollBarVisibility="Disabled"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="Column1"/> 
         <DataGridTextColumn Header="Column2" Width="1*" /> 
         <DataGridTextColumn Header="Column3" /> 
        </DataGrid.Columns> 
       </DataGrid> 
      </ListView> 
     </ListBox> 
    </Grid> 
</Window> 

아직도이 단지 해결 방법입니다. 합리적인 "수정"은 여전히 ​​환영합니다.

0

너비 = "자동"으로 문제가 해결됩니다. 또한 'MaxWidth'를 지정하여 열 너비 확장을 제한 할 수 있습니다. 이 도움이 될 것입니다

 <DataGrid.Columns> 
       <DataGridTextColumn Header="Column1"/> 
       <DataGridTextColumn Header="Column2" Width="Auto" MaxWidth="200" /> 
       <DataGridTextColumn Header="Column3"/> 
     </DataGrid.Columns> 

기대하고있다.

+0

두렵습니다. Width = "Auto"는 내용의 크기를 나타내지 만 "*"는 사용 가능한 공간에 _expand_가됩니다. 나는 후자가 필요하다. BTW, Width = "Auto"는 Width가 지정되지 않은 경우 기본값입니다 - AFAIK. 그래서 Width = "Auto"는 제 예제의 첫 번째 ListBoxItem과 같습니다. – user2261015

1

당신은 다시 ListBoxActualWidthDataGrid 폭을 바인딩 할 수 있습니다, 이것은 DataGrid에게 Auto 이외의 실제 크기를 줄 것이며, * 크기 조정 작업을해야합니다.

<!-- Broken column width: --> 
<DataGrid Width="{Binding ActualWidth, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsPresenter}}}" Margin="-2,0,0,0"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="Column1"/> 
     <DataGridTextColumn Header="Column2" Width="*"/> 
     <DataGridTextColumn Header="Column3"/> 
    </DataGrid.Columns> 
</DataGrid> 

그러나 사실 (가) 내용과 ListBox의 가장자리 사이에 약간의 간격입니다에, 당신이 조정할 수있다 인해 MarginDataGrid이까지가는 피하기 위해 작은 비트 (I 위처럼) 권리.

결과 : sa_ddam213의 제안에 본사를 둔

enter image description here

+0

이것은 유망한 appraoch입니다. 불행히도이 간단한 예제로만 작동합니다. 앞서 언급 한 것처럼 실제 dataGrid는 UserControl의 "어딘가"입니다. 실제로 그것은 Expander의 일부이며 일정량의 픽셀을 들여 쓰는 그리드의 일부입니다. 그래서 ItemPresenter의 ActualWidth는 DataGird의 필수 너비가 아니며 차이점에 대한 가정을 할 수 없습니다. 그래서 DataGrid를 다른 Grid에 중첩시키고 그 너비의 ActualWidth에 너비를 바인딩하려고했습니다. 창을 확대하면 좋지만 창을 축소하면 DataGrid가 더 이상 축소되지 않습니다. – user2261015