2015-01-14 6 views
9

हमारे आवेदन में हम टेम्पलेट सामग्री और बटन से भरे लेआउट पंक्तियों में डेटाग्रिड्स का उपयोग करते हैं, हालांकि एक समस्या अंतःक्रियात्मक रूप से होती है जहां कुछ कॉलम कभी-कभी कॉलम की न्यूनतम चौड़ाई तक कभी-कभी आकार लेते हैं और कभी-कभी कॉलम हेडर सामग्री चौड़ाई। यह उस समय से संबंधित कुछ प्रतीत होता है जिस पर आइटम्ससोर्स सेट किया गया है और जब लोडिंग ईवेंट होता है लेकिन मैं इसे निश्चित रूप से पिन नहीं कर सकता।डेटाग्रिड असंगत कॉलम चौड़ाई का आकार

गलत व्यवहार का उदाहरण broken

सही व्यवहार enter image description here

ItemsSource viewmodel जो async कीवर्ड और एक dataservice का उपयोग करने और इंतजार async भरता है पर एक ObservableCollection के लिए बाध्य है का उदाहरण।

मैं आरंभ पर और सभी स्तंभों को छुपा कर इस मुद्दे को ठीक करने का प्रयास किया तो एक बार ItemsSource सेट और isloaded सभी स्तंभों की आरंभिक दृश्यता को वापस स्थापित करने बुलाया गया है है, यह कुछ को प्रभावित करने के लिए लग रहा था, लेकिन ठीक नहीं पूरी तरह से समस्या है।

स्तंभ के लिए XAML परिभाषाएँ

<Style x:Key="MainDataGridColumnHeader" TargetType="{x:Type DataGridColumnHeader}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> 
       <TextBlock Text="{TemplateBinding Content}" Foreground="{StaticResource HighlightedTextBrush}" 
          Background="Transparent" 
          FontSize="16" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="MainDataGridRow" TargetType="{x:Type DataGridRow}"> 
    <Setter Property="Background" Value="{StaticResource LightBackgroundBrush}" /> 
    <Setter Property="BorderBrush" Value="{StaticResource Faded10MidBackgroundBrush}"/> 
    <Setter Property="BorderThickness" Value="0,0,0,1" /> 
    <Setter Property="SnapsToDevicePixels" Value="true" /> 
    <Setter Property="Padding" Value="5"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridRow}"> 
       <Border x:Name="DGR_Border" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         Background="{TemplateBinding Background}" 
         SnapsToDevicePixels="True" 
         CornerRadius="0" 
         Margin="0,5" 
         Width="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}}"> 
        <SelectiveScrollingGrid> 
         <SelectiveScrollingGrid.ColumnDefinitions> 
          <ColumnDefinition Width="Auto" /> 
          <ColumnDefinition Width="*" /> 
         </SelectiveScrollingGrid.ColumnDefinitions> 
         <SelectiveScrollingGrid.RowDefinitions> 
          <RowDefinition Height="*" /> 
          <RowDefinition Height="Auto" /> 
         </SelectiveScrollingGrid.RowDefinitions> 
         <DataGridCellsPresenter Grid.Column="1" 
              ItemsPanel="{TemplateBinding ItemsPanel}" 
              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
         <DataGridDetailsPresenter Grid.Column="1" 
               Grid.Row="1" 
               SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" 
               Visibility="{TemplateBinding DetailsVisibility}" /> 
         <DataGridRowHeader Grid.RowSpan="2" 
             SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" 
             Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" /> 
        </SelectiveScrollingGrid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="MainDataGridCell" TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Foreground" Value="{StaticResource TextBrush}"/> 
    <Setter Property="Focusable" Value="False"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True"> 
        <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

स्तंभ शीर्ष लेख, पंक्ति और सेल शैलियों

<DataGrid.Columns> 
      <DataGridTemplateColumn x:Name="dateColumn" Header="Race Time" MinWidth="110" Width="Auto" CellTemplate="{StaticResource RacesRaceTimeTemplate}" /> 
      <DataGridTemplateColumn x:Name="iconColumn" Width="62" CellTemplate="{StaticResource RacesRaceIconTemplate}"/> 
      <DataGridTemplateColumn x:Name="nameColumn" Width="*" CellTemplate="{StaticResource RacesRaceDescriptionTemplate}"/> 
      <DataGridTemplateColumn x:Name="favsColumn" Width="auto" Header="Fav/2nd Fav" CellTemplate="{StaticResource RacesFavSelectionsTemplate}" /> 
      <DataGridTemplateColumn x:Name="additionalColumn" Width="78" CellTemplate="{StaticResource RacesAdditionalOptionsTemplate}" /> 
     </DataGrid.Columns> 

अब मैं ज्यादातर स्तंभों के लिए हार्डकोडेड चौड़ाई सेट करके समस्या को हल कर सकते हैं के लिए के लिए XAML, लेकिन यह एक उचित समाधान नहीं है क्योंकि हमारे पास परिवर्तनीय चौड़ाई सामग्री होगी।

क्या किसी को इस समस्या का समाधान है?

+0

क्या आपने यह जवाब देखा [लिंक] (http://stackoverflow.com/a/5651287/2014167) – safi

+0

यह थोड़ी देर हो गया है क्योंकि मैंने xaml के साथ काम किया है .. क्या यह समस्या डिवाइस विशिष्ट है? –

+0

मुझे लगता है कि आप पहले कॉलम पर 'चौड़ाई = "ऑटो" और तीसरे स्थान पर' चौड़ाई = "*" 'निर्दिष्ट कर रहे हैं .. मैं समझता हूं * *' 'मतलब * * –

उत्तर

1

आप सभी स्तंभों की न्यूनतम चौड़ाई सेट करने का प्रयास किया, तो प्रतिशत

पर
<DataGrid.Columns> 
     <DataGridTemplateColumn x:Name="dateColumn" MinWidth="110" Width="*" Header="Race Time" CellTemplate="{StaticResource RacesRaceTimeTemplate}" /> 
     <DataGridTemplateColumn x:Name="iconColumn" MinWidth="62" Width="2*" CellTemplate="{StaticResource RacesRaceIconTemplate}"/> 
     <DataGridTemplateColumn x:Name="nameColumn" MinWidth="500" Width="3*" CellTemplate="{StaticResource RacesRaceDescriptionTemplate}"/> 
     <DataGridTemplateColumn x:Name="favsColumn" MinWidth="232" Width="3*" Header="Fav/2nd Fav" CellTemplate="{StaticResource RacesFavSelectionsTemplate}" /> 
     <DataGridTemplateColumn x:Name="additionalColumn" MinWidth="78" Width="*" CellTemplate="{StaticResource RacesAdditionalOptionsTemplate}" /> 
</DataGrid.Columns> 
1

आप इस answer देख सकते हैं आधारित चौड़ाई निर्दिष्ट।

प्रोग्राम के रूप में अपने ItemsSource

foreach (DataGridColumn c in dg.Columns) 
    c.Width = 0; 

// Update your DG's source here 

foreach (DataGridColumn c in dg.Columns) 
    c.Width = DataGridLength.Auto; 

और फिर अपने डेटा ग्रिड UpdateLayout करने के बाद अपना चौड़ाई कॉलम अद्यतन करने के लिए प्रयास करें।

संबंधित मुद्दे