2012-06-12 17 views
6

मेरे पास एक WPF डेटाग्रिड है जो ऊंचाई में बढ़ता है जब मैं उस डेटा को जोड़ता हूं जो इसकी प्रारंभिक ऊंचाई के अंदर फिट नहीं होगा। मैं नहीं चाहता कि ऊंचाई तब तक बदल जाए जब तक कि उपयोगकर्ता विंडो आकार को बढ़ा न ले। क्या इस ऑटो-आकार को रोकने का कोई तरीका है?WPF डेटाग्रिड की ऊंचाई बढ़ जाती है जब डेटा

<Window x:Class="WpfDataGridSizeTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Loaded="Window_Loaded" 
     SizeToContent="WidthAndHeight"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <DockPanel Grid.Row="0"> 
      <DataGrid x:Name="wordsDataGrid" VerticalAlignment="Top" ItemsSource="{Binding}" MinHeight="100" SelectionMode="Single" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" > 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Column" Width="Auto" Binding="{Binding AString}"/> 
       </DataGrid.Columns> 
      </DataGrid> 
     </DockPanel> 
    </Grid> 
</Window> 

    public partial class MainWindow : Window 
    { 
     MyList myList = new MyList(); 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void Window_Loaded(object sender, RoutedEventArgs e) 
     { 
      wordsDataGrid.DataContext = myList; 
      for (int i = 0; i < 100; ++i) 
      { 
       myList.AddOne("blah blah"); 
      } 
     } 
    } 

    public class MyList : ObservableCollection<AClass> 
    { 
     public MyList() { } 

     public void AddOne(string aString) 
     { 
      base.Add(new AClass(aString)); 
     } 
    } 

    public class AClass 
    { 
     public string AString { get; set; } 

     public AClass(string aString) 
     { 
      AString = aString; 
     } 
    } 
+0

इस्तेमाल किया एक 'RowDefinition' है कि' ऊंचाई = "*" ' –

+0

मैं इस @Meleak की कोशिश की में यह रखो, लेकिन यह यह कोई फर्क नहीं पड़ता। – Ian

उत्तर

4

यदि मुझे आपको गलत नहीं लगता है, तो आप चाहते हैं कि आपके डेटाग्रिड को अंत में ऊंचाई पर रखें, विंडोज़ के भीतर डेटाग्रिड के नीचे कुछ रिक्त स्थान के साथ ... फिर विंडो का आकार बदलने पर, डेटाग्रिड इसका आकार बदल देगा।

ग्रिड में एक और पंक्ति जोड़ें, और उस पंक्ति के मिनीहेइट को परिभाषित करें। फिर डेटाग्रिड को वर्टिकल एलाइनमेंट = स्ट्रैच करने के लिए सेट करें। विंडो के लिए एक डिफ़ॉल्ट ऊंचाई आकार भी सेट करें। इस के साथ साथ

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="1*"/> 
     <RowDefinition Height="1*"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="70"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 

    <DataGrid Name="dgMain" AutoGenerateColumns="True"></DataGrid> 

    </Grid> 

:

<Window x:Class="WpfDataGridSizeTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Loaded="Window_Loaded" Height="300"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition MinHeight="100"/> 
     </Grid.RowDefinitions> 
     <DockPanel Grid.Row="0" VerticalAlignment="Stretch"> 
      <DataGrid x:Name="wordsDataGrid" VerticalAlignment="Stretch" ItemsSource="{Binding}" MinHeight="100" SelectionMode="Single" AutoGenerateColumns="False" VerticalScrollBarVisibility="Auto" > 
       <DataGrid.Columns> 
        <DataGridTextColumn Header="Column" Width="Auto" Binding="{Binding AString}"/> 
       </DataGrid.Columns> 
      </DataGrid> 
     </DockPanel> 
    </Grid> 
</Window> 
+0

काफी नहीं। मैं चाहता हूं कि डाटाग्रिड की ऊंचाई कितनी पंक्तियों में से स्वतंत्र हो, यह डिज़ाइन व्यू में समान ऊंचाई बनी रहें। उपयोगकर्ता विंडो के आकार को बदल सकता है जो RowDefinitions के आधार पर हो सकता है, ग्रिड पंक्ति का आकार बदलें।उस मामले में मैं ग्रिड व्यू के साथ ग्रिड व्यू की ऊंचाई बढ़ाना चाहता हूं। – Ian

+0

उपर्युक्त कोड इस बात से स्वतंत्र है कि इसमें कितनी पंक्तियां हैं, डेटाग्रिड उसी ऊंचाई तक रहेगा जब तक उपयोगकर्ता विंडो का आकार बदलता नहीं है। पंक्ति एक (जिसमें डेटाग्रिड होता है) विंडो के भीतर छोड़ी गई शेष ऊंचाई का उपयोग कर रहा है। अब कहें खिड़की 300 है, दूसरी पंक्ति में 100 का इस्तेमाल किया जाता है, 200 डाटाग्रिड के लिए उपयोग करेगा। जब उपयोगकर्ता विंडो को 500 का आकार बदलता है, 400 डेटाग्रिड के लिए उपयोग किया जाएगा ... कोई फर्क नहीं पड़ता कि डेटाग्रिड में कितनी पंक्ति है, इससे ऊंचाई बढ़ेगी। –

+0

क्षमा करें, मैंने पहली बार आपके समाधान का परीक्षण करते समय एक त्रुटि की है। ऐसा लगता है कि यह काम करता है। – Ian

0

VerticalAlignment = Top उदाहरण के लिए या स्पष्ट रूप से कुछ मूल्य को Height गुण सेट का उपयोग करें।

This भी मदद कर सकता है ... डेटाग्रिड को एक स्टैकेपनेल में डालने और सट्टेपन के आकार के व्यवहार को नियंत्रित करने में मदद कर सकता है।

+0

वर्टिकल एलाइनमेंट सेट करना = "टॉप" मदद नहीं करता है। मैं ऊंचाई को स्पष्ट रूप से सेट नहीं करना चाहता क्योंकि मैं चाहता हूं कि ग्रिड बढ़ने के लिए जब उपयोगकर्ता का आकार विंडो द्वारा बढ़ाया जाए। मैं बस ऊंचाई जोड़ना चाहता हूं क्योंकि डेटा जोड़ा जाने से पहले है। मुझे यकीन नहीं है कि मैं जो चाहता हूं उसे प्राप्त करने के लिए एक संलग्न स्टैकपैनल पर कौन से गुण सेट करना है। – Ian

0

यदि समस्या पूरी ग्रिड बढ़ रही है (लेकिन आप व्यक्तिगत पंक्तियों के बढ़ने के लिए खुश हैं) तो: डेटाग्रिड अंदर मौजूद मूल पैनल क्या है? इसे बदलने से नियंत्रण का आकार बदल सकता है।

उदाहरण के लिए: StackPanel अपने बच्चों को एक दिशा (स्टैकिंग की दिशा) में बढ़ने की अनुमति देगा, और DockPanel उपलब्ध स्थान पर "भरे" तत्व के आकार को सीमित कर देगा।

+0

पंक्ति का आकार बदल नहीं रहा है। मैं बस पाठ प्रदर्शित कर रहा हूँ। मैंने डाटाग्रिड को ग्रिड के अंदर एक ग्रिड और डॉकपैनल के विंडो के बच्चे होने का प्रयास किया है। जब मैं पंक्तियों को जोड़ता हूं तो सभी मामलों में डेटाग्रिड मेरी स्क्रीन की हाइट से थोड़ा अधिक बढ़ता है। – Ian

1

यह तुम क्या इच्छा करना होगा

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     Foo foo; 
     List<Foo> foos = new List<Foo>(); 

     foo = new Foo() { Name = "Sjaak" }; 
     foos.Add(foo); 

     foo = new Foo() { Name = "Joepie" }; 
     foos.Add(foo); 

     dgMain.ItemsSource = foos; 

    } 
} 

public class Foo 
{ 
    public Foo() { } 

    public String Name { get; set; } 
} 

चाल "1 का उपयोग करके आनुपातिक (भी) पंक्ति ऊंचाइयों के वितरण में है * "दोनों पंक्तियों की ऊँचाई गुणों के लिए। तुम भी एक पंक्ति ऊंचाई "2 *" आदि

1

मैं एक ही समस्या थी करने के लिए सेटिंग के द्वारा अन्य "शेयर" में यह ditribute सकते हैं, और मैं बस खिड़की परिभाषा SizeToContent = "WidthAndHeight" निकाल कर यह तय ।

+0

मैंने जो स्वीकार्य उत्तर सुझाया, वह किया लेकिन इस के बिना काम नहीं किया - लेकिन याद करने में आसान – stambikk

0
VerticalAlignment="Bottom" 

इस सटीक समस्या को हल करने के लिए मेरे लिए काम किया। मैं भी

VerticalScrollBarVisibility="Auto"  
संबंधित मुद्दे