ठीक है, दूसरी बार आकर्षण है। आपके लेआउट स्क्रीनशॉट के आधार पर, मैं तुरंत अनुमान लगा सकता हूं कि आपको जो चाहिए वह WrapPanel
है, एक लेआउट पैनल जो आइटम को किनारे तक पहुंचने तक भरने की अनुमति देता है, जिस बिंदु पर शेष आइटम अगली पंक्ति पर बहती हैं। लेकिन आप अभी भी ItemsControl
का उपयोग करना चाहते हैं ताकि आप डेटा-बाध्यकारी और गतिशील पीढ़ी के सभी लाभ प्राप्त कर सकें। तो इसके लिए हम ItemsControl.ItemsPanel
संपत्ति का उपयोग करने जा रहे हैं, जो हमें पैनल को निर्दिष्ट करने की अनुमति देता है जिसमें वस्तुओं को रखा जाएगा। के कोड-पीछे फिर से शुरू करते हैं:
public partial class Window1 : Window
{
public ObservableCollection<Field> Fields { get; set; }
public Window1()
{
InitializeComponent();
Fields = new ObservableCollection<Field>();
Fields.Add(new Field() { Name = "Username", Length = 100, Required = true });
Fields.Add(new Field() { Name = "Password", Length = 80, Required = true });
Fields.Add(new Field() { Name = "City", Length = 100, Required = false });
Fields.Add(new Field() { Name = "State", Length = 40, Required = false });
Fields.Add(new Field() { Name = "Zipcode", Length = 60, Required = false });
FieldsListBox.ItemsSource = Fields;
}
}
public class Field
{
public string Name { get; set; }
public int Length { get; set; }
public bool Required { get; set; }
}
ज्यादा नहीं यहां से बदल गया है, लेकिन मैं नमूना क्षेत्रों बेहतर अपने उदाहरण से मिलान करने के संपादित किया है। अब हम जहां जादू Window
के लिए XAML happens- को देखो:
<Window x:Class="DataBoundFields.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DataBoundFields"
Title="Window1" Height="200" Width="300">
<Window.Resources>
<local:BoolToVisibilityConverter x:Key="BoolToVisConverter"/>
</Window.Resources>
<Grid>
<ListBox x:Name="FieldsListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Label Content="{Binding Name}" VerticalAlignment="Center"/>
<TextBox Width="{Binding Length}" Margin="5,0,0,0"/>
<Label Content="*" Visibility="{Binding Required, Converter={StaticResource BoolToVisConverter}}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal"
Height="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=ActualHeight}"
Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=ActualWidth}"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
</Grid>
सबसे पहले, आप देखेंगे कि ItemTemplate
थोड़ा बदल गया है। लेबल अभी भी नाम संपत्ति से जुड़ा हुआ है, लेकिन अब टेक्स्टबॉक्स चौड़ाई लंबाई संपत्ति से जुड़ी है (इसलिए आप अलग-अलग लंबाई के टेक्स्टबॉक्स प्राप्त कर सकते हैं)। इसके अलावा, मैंने किसी भी फ़ील्ड में एक "*" जोड़ा है जो एक सरल BoolToVisibilityConverter
(जिसे आप कहीं भी कोड पा सकते हैं, और मैं यहां पोस्ट नहीं करूंगा) का उपयोग कर आवश्यक है।
मुख्य बात सूचना के लिए हमारे ListBox
की ItemsPanel
संपत्ति में एक WrapPanel
का उपयोग है। यह ListBox
बताता है कि जो भी आइटम उत्पन्न करता है उसे क्षैतिज लिपटे लेआउट में धक्का दिया जाना चाहिए (यह आपके स्क्रीनशॉट से मेल खाता है)। इस काम को और भी बेहतर बनाता है कि पैनल पर ऊंचाई और चौड़ाई बाध्यकारी है- यह क्या कहता है, "इस पैनल को मेरी मूल विंडो के समान आकार बनाएं।" इसका मतलब है कि जब मैं Window
का आकार बदलता हूं, तो WrapPanel
तदनुसार इसके आकार को समायोजित करता है, जिसके परिणामस्वरूप वस्तुओं के लिए बेहतर लेआउट होता है। यहाँ दो स्क्रीनशॉट इस का प्रदर्शन:
alt text http://img156.imageshack.us/img156/6849/wrappanelfields.png
alt text http://img12.imageshack.us/img12/2426/wrappanelfields2.png
+1, लेकिन मुझे लगता है कि ओपी लंबाई चाहता था और इनपुट को बाधित करने के लिए आवश्यक था। –
बेशक, लेकिन मुझे यकीन नहीं है कि वह वास्तव में उन बाधाओं का उपयोग कैसे करना चाहता है, इसलिए मैंने इसे बिना छोड़ा। – Charlie
परेशानी है- और शायद मैं परिवर्तनीय नाम "माईग्रिड" का उपयोग करके मामलों को भ्रमित कर रहा हूं- मैं डेटाग्रिड नहीं, पर जोड़ रहा हूं। यह डेटा प्रविष्टि फ़ॉर्म है जिसे मुझे एक विशिष्ट क्रम में बाहर करना है। 3 लेबल हो सकते हैं/टेक्स्टबॉक्स के साथ टेक्स्टबॉक्स संयोजन, एक पंक्ति पर अलग-अलग लंबाई, और अगली पंक्ति पर 10। इस फ़ॉर्म के विभिन्न संस्करण हैं, यही कारण है कि फ़ील्ड डेटाबेस से लोड हो जाते हैं, और मैं इसे गतिशील क्यों कहता हूं। इसलिए यह नहीं है डेटाग्रिड लेआउट में अच्छी तरह से फिट करें और यही कारण है कि मैं उन्हें गतिशील रूप से बनाने की कोशिश कर रहा था। क्या मेरे पास ऑब्जेक्ट में एक और फ़ील्ड है - LastFieldOnLine नई लाइन –
user210757