2013-04-09 8 views
6

में विफल रहता है मेरे पास एक सूची बॉक्स है जिसमें UserControl से व्युत्पन्न आइटम शामिल हैं। कंक्रीट UserControl में डेटाग्रिड (दूसरों के बीच) शामिल है। असल में मैं कंक्रीट UserControl नहीं बदल सकता (केवल परीक्षण उद्देश्य के लिए परिवर्तन; इसकी तीसरी पार्टी की तरह)। जैसे ही एक कॉलम चौड़ाई "*" पर सेट की जाती है, सभी कॉलम की डेटाग्रिड कॉलम चौड़ाई टूट जाती है, जो पूर्ण स्थान को भरने के लिए आवश्यक होती है।wpf डेटाब्रिड कॉलम चौड़ाई ListBox

मैं इसे एक सरलीकृत उदाहरण (w/o UserControl) के साथ पुन: उत्पन्न कर सकता हूं। इसलिए यदि मैं ListBoxItem के रूप में डेटाग्रिड जोड़ता हूं, तो कॉलम चौड़ाई को "*" की कॉलम चौड़ाई निर्दिष्ट करता है। बीटीडब्लू, कॉलम को उपयोगकर्ता द्वारा अब भी आकार में नहीं बदला जा सकता है।

सरल उदाहरण:

<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

sa_ddam213 के सुझाव में आधारित मैं एक kludge कि काम करता है पाया। मेरे पास अभी तक कोई अन्य विचार नहीं है।

मैं एक ListView द्वारा डेटा ग्रिड लिपटे, सभी ListView से "सजावट" हटा दिया है, और ListView की ActualWidth को GridViewColumn की चौड़ाई के लिए बाध्य। हो सकता है कि ListView कार्यों के अलावा कुछ नियंत्रण भी हो। मैं सिर्फ सूची दृश्य के साथ खेल रहा था। एक साधारण सीमा काम नहीं करती है।

मार्जिन को किसी तरह से tweaked किया जाना चाहिए और दाएं तरफ एक अंतर है मैं छुटकारा नहीं मिलता (लेकिन मैं इसके साथ रह सकता है)। जब तक मैं डेटाग्रिड की क्षैतिज स्क्रॉलबार्वरिबिलिटी अक्षम नहीं करता हूं, तब तक मुझे माउस द्वारा विधवा चौड़ाई खींचते समय अजीब चमकती भूत क्षैतिज स्क्रॉलबार मिलते हैं।

तो यहां एक्सएएमएल है जो पर्याप्त प्रतीत होता है। ध्यान दें कि वास्तविक 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

चौड़ाई = "ऑटो" समस्या का समाधान करेगा। कॉलमविड्थ विस्तार को सीमित करने के लिए आप 'मैक्सविड्थ' निर्दिष्ट कर सकते हैं।

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

होप्स इस में मदद मिलेगी।

+0

मुझे डर है कि यह नहीं होगा। चौड़ाई = "ऑटो" सामग्री के आकार का होगा, जबकि "*" उपलब्ध स्थान पर _expand_ होगा। मुझे बाद वाले की जरूरत है। बीटीडब्लू, चौड़ाई = "ऑटो" डिफ़ॉल्ट है अगर चौड़ाई निर्दिष्ट नहीं है - AFAIK। तो चौड़ाई = "ऑटो" मेरे उदाहरण में पहली सूची बॉक्स Item के समान होगा। – user2261015

1

आप DataGrid चौड़ाई वापस ListBoxActualWidth करने के लिए बाध्य कर सकता है, यह एक वास्तविक DataGridAuto के अलावा अन्य आकार दे देंगे और * आकार काम करना चाहिए।

<!-- 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 के किनारों के बीच कुछ अंतर है, तो आप tweak करना पड़ सकता है Margin (जैसे मैं ऊपर किया) एक छोटा सा DataGrid के लिए खत्म हो जाने से बचने की सही।

परिणाम:

enter image description here

+0

यह एक आशाजनक अपहरण है। दुर्भाग्य से यह केवल मेरे सरल उदाहरण के साथ काम करता है। जैसा कि मैंने उल्लेख किया है, वास्तविक डेटाग्रिड UserControl में "कहीं" है। वास्तव में यह एक ग्रिड का हिस्सा है जो एक विस्तारक का हिस्सा है और कुछ पिक्सल इंडेंट किया गया है। इसलिए आइटमपेंडर का वास्तविक विडियो डेटागर्ड की आवश्यक चौड़ाई नहीं है और मैं अंतर के बारे में कोई धारणा नहीं कर सकता। इसलिए मैंने डेटाग्रिड को किसी अन्य ग्रिड में घोंसला करने की कोशिश की और चौड़ाई को उस गर्ड के वास्तविक विचलन में बांधने की कोशिश की। खिड़की को बड़ा करते समय यह अच्छा काम करता है लेकिन खिड़की को कम करते समय डेटाग्रिड अब और भी कम नहीं होता है। – user2261015

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