2010-11-02 28 views
13

मैं `ve हाल ही में एक WPF (सी/4.0) डेटा ग्रिड के भीतर काम कर टेक्स्ट रैपिंग पाने के लिए कोशिश कर रहा है, और कोई बात नहीं है जो समाधान मैं लागू (सभी रैपिंग के साथ एक टेम्पलेट के अंदर TextBlock के कुछ फार्म का उपयोग करें) यह confuses ग्रिड की ऑटो ऊंचाई और ग्रिड के नीचे अत्यधिक सफेद जगह (दृश्यता के लिए पीला सेट करें) में परिणाम।WPF डेटा ग्रिड AutoSize अंक

मेरे कोड: (टिप्पणी की कोड टेक्स्ट रैपिंग के लिए वैकल्पिक समाधान है, लेकिन अभी भी अत्यधिक अंतरिक्ष में जो परिणाम)

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <DataGrid Grid.Row="0" AutoGenerateColumns="False" ColumnWidth="*" Name="dgFamilyHistories" IsReadOnly="True" 
          HorizontalScrollBarVisibility="Disabled" 
         ItemsSource="{Binding Path=Patient.FamilyHistories}" RowDetailsVisibilityMode="Visible" 
         GridLinesVisibility="All"> 
     <DataGrid.Resources> 
      <Style TargetType="{x:Type DataGridRow}"> 
       <Setter Property="Height" Value="Auto"/> 
      </Style> 
      <!--<Style TargetType="{x:Type DataGridCell}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type DataGridCell}"> 
          <Border Name="border"> 
           <ContentControl Content="{TemplateBinding Content}"> 
            <ContentControl.ContentTemplate> 
             <DataTemplate> 
              <DockPanel> 
               <TextBlock TextWrapping="WrapWithOverflow" TextTrimming="CharacterEllipsis" 
                 Width="Auto" Height="Auto" Text="{Binding Text}"/> 
              </DockPanel> 
             </DataTemplate> 
            </ContentControl.ContentTemplate> 
           </ContentControl> 
          </Border> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style>--> 
     </DataGrid.Resources> 
     <DataGrid.Background> 
      <SolidColorBrush Color="Yellow" /> 
     </DataGrid.Background> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Date" Binding="{Binding DateEntered, StringFormat={}{0:dd/MM/yyyy}}" Width="85"/> 
      <!--<DataGridTextColumn Header="Relation" Binding="{Binding Relation}"/>--> 
      <DataGridTemplateColumn Header="Relation"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock TextTrimming="CharacterEllipsis" TextWrapping="Wrap" Text="{Binding Path=Relation}"/> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
      <!--<DataGridTextColumn Header="Illness" Binding="{Binding Illness}"/>--> 
      <DataGridTemplateColumn Header="Illness"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock TextTrimming="CharacterEllipsis" TextWrapping="Wrap" Text="{Binding Path=Illness}"/> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
      <!--<DataGridTextColumn Header="Health" Binding="{Binding Health}"/>--> 
      <DataGridTemplateColumn Header="Health"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock TextTrimming="CharacterEllipsis" TextWrapping="Wrap" Text="{Binding Path=Health}"/> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
      <DataGridTextColumn Header="Birth Date" Binding="{Binding DateOfBirth, StringFormat={}{0:dd/MM/yyyy}}" Width="85"/> 
      <DataGridTextColumn Header="Death Date" Binding="{Binding DateOfDeath, StringFormat={}{0:dd/MM/yyyy}}" Width="85"/> 
      <!--<DataGridTextColumn Header="Death Cause" Binding="{Binding CauseOfDeath}"/>--> 
      <DataGridTemplateColumn Header="Death Cause"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock TextTrimming="CharacterEllipsis" TextWrapping="Wrap" Text="{Binding Path=CauseOfDeath}"/> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
      <DataGridTextColumn Header="Age" Binding="{Binding Age}" Width="50"/> 
     </DataGrid.Columns> 
     <DataGrid.RowDetailsTemplate> 
      <DataTemplate> 
       <Label Name="lblDetails" Content="{Binding Path=Comments}" ContentStringFormat="{}Comments: {0}" Margin="15,0,0,0"/> 
       <DataTemplate.Triggers> 
        <DataTrigger Binding="{Binding Path=Comments, Converter={Converters:IsNullStringConverter}}" Value="True"> 
         <Setter TargetName="lblDetails" Property="Visibility" Value="Collapsed"/> 
        </DataTrigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 
     </DataGrid.RowDetailsTemplate> 
    </DataGrid> 
    <DockPanel Grid.Row="1" Background="Blue"> 

    </DockPanel> 
</Grid> 

उत्तर

0

हाँ, मैं का सामना किया है और वह भी एक बग होना चाहिए। मुद्दा वास्तव में खुद को लपेटना नहीं है बल्कि इसके बजाय एक सेल जितना जल्दी हो जाता है, तब डेटाग्रिड की ऊंचाई तब तक अपडेट नहीं होगी जब तक कि इसका आकार किसी भी कारण (विंडो या जो कुछ भी बदलता है) के आकार में नहीं बदला जाता है। मेरे पास इस समस्या का कोई अच्छा समाधान नहीं है लेकिन यहां कुछ प्रकार का कामकाज है।

अद्यतन

अनुकूलित संस्करण, DataGridColumn के TextBlocks के बजाय का उपयोग कर। लपेटने वाले कॉलम को जानने के लिए एक संलग्न संपत्ति WrapColumn (झूठी पर डिफ़ॉल्ट) का उपयोग करता है।

Xaml। स्थानीय जोड़ें: मेनविंडो। रैप कॉलम = प्रत्येक रैपिंग कॉलम के लिए "ट्रू"।

<DataGridTemplateColumn Header="Health" 
         local:MainWindow.WrapColumn="True"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock TextTrimming="CharacterEllipsis" 
         TextWrapping="Wrap" 
         Text="{Binding Path=Health}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

एक संलग्न संपत्ति

public partial class MainWindow : Window 
{ 
    private static readonly DependencyProperty WrapColumnProperty = 
      DependencyProperty.RegisterAttached("WrapColumn", 
               typeof(bool), 
               typeof(MainWindow)); 
    public static void SetWrapColumn(DependencyObject element, bool value) 
    { 
     element.SetValue(WrapColumnProperty, value); 
    } 
    public static bool GetWrapColumn(DependencyObject element) 
    { 
     return (bool)element.GetValue(WrapColumnProperty); 
    } 

जोड़े ActualWidth हर DataGridColumn यह सच

public MainWindow() 
{ 
    InitializeComponent(); 

    DependencyPropertyDescriptor dependencyPropertyDescriptor = 
     DependencyPropertyDescriptor.FromProperty(DataGridColumn.ActualWidthProperty, typeof(DataGridColumn)); 

    if (dependencyPropertyDescriptor != null) 
    { 
     foreach (DataGridColumn column in c_dataGrid.Columns) 
     { 
      if (GetWrapColumn(column) == true) 
      { 
       dependencyPropertyDescriptor.AddValueChanged(column, DataGridColumn_ActualWidthChanged); 
      } 
     } 
    } 

    void DataGridColumn_ActualWidthChanged(object sender, EventArgs e) 
    { 
     c_dataGrid.Width = c_dataGrid.ActualWidth - 1; 
     EventHandler eventHandler = null; 
     eventHandler = new EventHandler(delegate 
     { 
      c_dataGrid.Width = double.NaN; 
      c_dataGrid.LayoutUpdated -= eventHandler; 
     }); 
     c_dataGrid.LayoutUpdated += eventHandler; 
    } 
    //... 
} 
+0

यह समाधान काम करता है करने के लिए सेट WrapColumn है के लिए बदल जाता है के लिए एक श्रोता जोड़े, लेकिन ऑटो आकार फ्लो दस्तावेज़ के साथ प्रिंट करते समय भी उलझन में आता है। यदि प्रवाह दस्तावेज़ आकार बदलता है तो इसकी ऊंचाई सही ढंग से प्रदर्शित होती है लेकिन सभी कॉलम squished हैं। –

+0

देखा गया कि आपने इसे मंजूरी दे दी और कुछ देर बाद इसे अस्वीकार कर दिया, इसलिए मुझे लगा कि कुछ गेंद नहीं खेल रहा था। तो कॉलम न्यूनतम चौड़ाई के साथ समाप्त होता है या प्रभाव क्या होता है? –

+0

बहुत अधिक, मूल रूप से मैं ग्रिड ले रहा हूं और इसे एक फ्लो दस्तावेज़ में डाल रहा हूं जिसे मैं प्रिंट कर रहा हूं। अनिवार्य रूप से क्या होता है कि जैसे ही प्रवाह दस्तावेज़ एक पृष्ठ से अधिक हो जाता है, उस पर पहला डेटाग्रिड गड़बड़ हो जाता है। (समग्र ग्रिड सही चौड़ाई है और इसलिए हेडर हैं, लेकिन पैर के अंगूठे की कोशिकाओं सभी बाईं ओर squished रहे हैं। बीमार कोशिश करते हैं और एक स्क्रीन शॉट पोस्ट। –

1
Use this way, to expand your datagrid with proper height and width 
    <my:DataGridTemplateColumn Header="{DynamicResource name}" Width="*" 
                  CanUserSort="True" SortMemberPath="Name" 
                  HeaderStyle="{StaticResource StaffDgColoumnHeaderStyle}"> 
           <my:DataGridTemplateColumn.CellTemplate> 
            <DataTemplate> 
             <TextBlock Style="{StaticResource RowTextblockStyle}" >`enter code here` 
               <Hyperlink> 
                <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Name}" 
                   TextWrapping="NoWrap" TextTrimming="CharacterEllipsis"/> 
               </Hyperlink> 
              </TextBlock> 
            </DataTemplate> 
           </my:DataGridTemplateColumn.CellTemplate> 
          </my:DataGridTemplateColumn> 

          <my:DataGridTemplateColumn Header="{DynamicResource sft}" Width="*" 
                  CanUserSort="True" SortMemberPath="ShiftName" 
                  HeaderStyle="{StaticResource StaffDgColoumnHeaderStyle}"> 
           <my:DataGridTemplateColumn.CellTemplate> 
            <DataTemplate> 
             <TextBlock Text="{Binding ShiftName}" ToolTip="{Binding ShiftName}" 
                 Style="{StaticResource RowTextblockStyle}"/> 
            </DataTemplate> 
           </my:DataGridTemplateColumn.CellTemplate> 
          </my:DataGridTemplateColumn> 

See Width ="*" Or Use Width ="Auto" or Width = "20*" as per as your requirement. 
संबंधित मुद्दे