2009-06-24 15 views
8

मैंने देखा कि डब्ल्यूपीएफ डिजाइनर विंडोज फॉर्म डिजाइनर की तुलना में नियंत्रण को संरेखित करने पर बहुत खराब काम करता है।मैं एक WPF विंडो में नियंत्रण को त्वरित रूप से कैसे संरेखित कर सकता हूं?

नीचे दी गई विंडो में, मैं प्रत्येक लेबल को संरेखित करने में असमर्थ हूं, ताकि उसका टेक्स्ट टेक्स्ट बॉक्स के टेक्स्ट के समान ही लाइन पर हो। पहला लेबल सही ढंग से गठबंधन है, लेकिन डब्ल्यूपीएफ डिजाइनर मुझे दूसरे और तीसरे को सही ढंग से संरेखित करने के लिए कोई स्नैप लाइन नहीं देता है।

इसके अलावा, मैं लेबल के साथ बटन को संरेखित नहीं कर सकता। स्नैप लाइन लेबल ग्रंथों की तुलना में बटन को कुछ पिक्सेल बाएं तरफ रखती है।

मुझे XAML कोड लिखने, मैन्युअल रूप से इस संरेखण को करने का तेज़ तरीका नहीं मिला। नियंत्रण को ग्रिड में रखना, और प्रत्येक नियंत्रण का मार्जिन सेट करना समय लेने वाला है।

alt text http://img520.imageshack.us/img520/4843/wpfdesigneralignment.png

आप WPF खिड़कियों में नियंत्रण संरेखित करने के लिए एक तेजी से रास्ता पता है?

उत्तर

3

मैंने सोचा कि मैं हाथ से कोडित XAML के साथ संरेखण करने से बच सकता हूं। क्या मैं के साथ, यह (शैलियों अन्य विंडो में पुन: उपयोग किया जा सकता है) है समाप्त हो गया:

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Window1" SizeToContent="WidthAndHeight"> 
    <Window.Resources> 
     <Style x:Key="ControlStyle" TargetType="Control"> 
      <Setter Property="HorizontalAlignment" Value="Left"/> 
      <Setter Property="VerticalAlignment" Value="Center"/> 
     </Style> 
     <Style BasedOn="{StaticResource ControlStyle}" TargetType="Label"> 
      <Setter Property="Margin" Value="-4,0,0,0"/> 
     </Style> 
     <Style BasedOn="{StaticResource ControlStyle}" TargetType="TextBox"> 
      <Setter Property="Width" Value="120"/> 
     </Style> 
     <Style BasedOn="{StaticResource ControlStyle}" TargetType="Button"> 
      <Setter Property="MinWidth" Value="70"/> 
     </Style> 
     <Style TargetType="Grid"> 
      <Setter Property="Margin" Value="10,10,10,10"/> 
     </Style> 
     <Style x:Key="SeparatorColumn" TargetType="ColumnDefinition"> 
      <Setter Property="Width" Value="10"/> 
     </Style> 
     <Style x:Key="SeparatorRow" TargetType="RowDefinition"> 
      <Setter Property="Height" Value="3"/> 
     </Style> 
    </Window.Resources> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition Style="{StaticResource SeparatorColumn}"/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition Style="{StaticResource SeparatorRow}"/> 
      <RowDefinition/> 
      <RowDefinition Style="{StaticResource SeparatorRow}"/> 
      <RowDefinition/> 
      <RowDefinition Style="{StaticResource SeparatorRow}"/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <Label Grid.Row="0" Grid.Column="0">Label:</Label> 
     <TextBox Grid.Row="0" Grid.Column="2">TextBox</TextBox> 
     <Label Grid.Row="2" Grid.Column="0">Label:</Label> 
     <TextBox Grid.Row="2" Grid.Column="2">TextBox</TextBox> 
     <Button Grid.Row="4" Grid.ColumnSpan="3">Button</Button> 
     <Label Grid.Row="6" Grid.Column="0">Label:</Label> 
     <TextBox Grid.Row="6" Grid.Column="2">TextBox</TextBox> 
    </Grid> 
</Window> 
+0

क्या आपको कोई बेहतर, अधिक पूर्ण समाधान मिला? –

5

अपने नियंत्रणों को रखने के लिए ग्रिड का उपयोग करें, फिर सुनिश्चित करें कि आपके पास नियंत्रण पर कोई पैडिंग नहीं है ... बेशक आप कुछ पैडिंग नहीं चाहते हैं और आप सुनिश्चित करते हैं कि वे सभी भी हैं।

Introduction to the WPF Grid Control

+5

+1। फॉर्म लेआउट के लिए कैनवास का उपयोग करना वास्तव में आखिरी चीज है जिसे आपको डब्ल्यूपीएफ में करना चाहिए। जब तक आपको बिल्कुल नियंत्रण की स्थिति पूरी तरह से करने की आवश्यकता नहीं है। – Joey

0

सबसे अच्छा तरीका ग्रिड या DockPanel उपयोग करने के लिए है:

एक त्वरित गूगल खोज एक बुनियादी ट्यूटोरियल लौट आए।
ज्यादातर मामलों में मार्जिन की आवश्यकता नहीं है।

2

डिफ़ॉल्ट ग्रिड का उपयोग करने के बजाय, इच्छित संरेखण के लिए उपयुक्त पैनल नियंत्रण (स्टैकपैनेल, डॉकपनेल, आदि) का उपयोग करें। ग्रिड नियंत्रण जहां चाहें खिड़की पर नियंत्रण खींचना आसान बनाता है (कैनवास के रूप में काफी समेकित होने के बिना), लेकिन इस बारे में कोई धारणा नहीं है कि आप वास्तव में किस प्रकार के लेआउट का निर्माण करने की कोशिश कर रहे हैं।

यदि लेआउट जिसे आप डिजाइन करने की कोशिश कर रहे हैं, वास्तव में, 'ग्रिड' (या तालिका, जैसे पंक्तियां और कॉलम) है, तो मैं या तो यूनिफॉर्मग्रिड नियंत्रण (समान रूप से दूरी वाली पंक्तियों और स्तंभों के लिए) या ग्रिड का उपयोग करने का सुझाव देता हूं ऊंचाई/चौड़ाई प्रति पंक्ति/कॉलम सेट करें और सभी तत्वों पर मार्जिन 0 पर सेट करें (पूरी तरह से अपने सेल को भरने के लिए)।

+2

इस मामले में यह एक ग्रिड लगता है, जो स्क्रीनशॉट से निर्णय लेता है। उस तरह का लेआउट स्टैकपैनल्स के साथ मजेदार नहीं है :) – Joey

0

मुझे लगता है कि "फ़ॉर्म लेआउट" (दो कॉलम के समूहों, सभी लेबल एक ही आकार करता है एक कस्टम पैनल लिखा गया है, सभी नियंत्रण एक ही आकार, सबकुछ गठबंधन, आदि), यह मेरे ब्लॉग पर है: http://www.nbdtech.com/Blog/archive/2010/07/27/easy-form-layout-in-wpf-part-1-ndash-introducing-formpanel.aspx

यह एक्सएएमएल संपादित करते समय उपयोग करने के लिए त्वरित और आसान होने के लिए डिज़ाइन किया गया है, मैंने इसे डिजाइनर में भी कोशिश नहीं की।

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

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