2009-06-18 7 views
5

मैं सोच रहा हूं, प्रसिद्ध लेबल इनपुट [या आउटपुट, कोई फर्क नहीं पड़ता] संयोजन प्राप्त करने का सबसे अच्छा और तेज़ तरीका कौन सा है डब्ल्यूपीएफ में इसका एक सरल कार्य, बस "वस्तु" की एक त्वरित उत्पादन के बारे में सोच मुझे:डब्ल्यूपीएफ - रन-ऑफ-द-मिल के लिए सर्वश्रेष्ठ अभ्यास [लेबल: इनपुट] नियंत्रण


नाम - ईसाई

उम्र - 28

मूड - अच्छा


मैं पता है, मैं टेक्स्टब्लॉक के साथ ग्रिड का उपयोग कर सकता हूं। लेकिन ईमानदार होने के लिए, इसके लिए "शॉर्ट" एक्सएएमएल लगभग आधा पृष्ठ लंबा है (प्रत्येक लेबल पर पंक्ति परिभाषाएं, कॉलडिफ, ग्रिड.कॉल)

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

तो, उपर्युक्त स्थिति को देखते हुए, आपको 3-6 गुणों के साथ एक कस्टम ऑब्जेक्ट मिला है, जिसे आप केवल अपने जीयूआई के रूप में डंप करना चाहते हैं, आप इसे कैसे करेंगे (डब्ल्यूपीएफ, सिल्वरलाइट में भी, यदि आप वास्तव में हैं मूड :)

मैं निश्चित रूप से इसके लिए उपयोगकर्ता नियंत्रण लिख सकता हूं। लेकिन आगे भी उदाहरण मैं सिर्फ वास्तविक जीवन में बनाया वर्णन करने के लिए, पहिया बदलने, अगर यह पहले से ही वहाँ हो सकती है ...

और अंत में, और इस पोस्ट के लिए कारण था:

 <StackPanel> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Log Count" Width="100"/> 
      <TextBlock Text="{Binding LastLogRun.LogMessageCount}"/> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="Start Time" Width="100"/> 
      <TextBlock Text="{Binding LastLogRun.StartTime}"/> 
     </StackPanel> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="End Time" Width="100"/> 
      <TextBlock Text="{Binding LastLogRun.EndTime}"/> 
     </StackPanel> 
    </StackPanel> 
+0

आप दो चीजें "सर्वोत्तम/सर्वोत्तम प्रथाओं" और "त्वरित/त्वरित आउटपुट/डंप" के लिए पूछ रहे हैं। आप कौन सा चाहते है? ब्रायन ए आपको एक त्वरित समाधान देता है, और जो डब्ल्यू आपको एक अच्छा प्रारूपण समाधान देता है जिसे आप अपने प्रश्न में खारिज करते हैं ... – micahtan

+0

हाँ, आप सही हैं, अब तक का सबसे अच्छा सवाल नहीं था। मुझे लगता है कि ब्रायन ए उत्तर जितना छोटा होगा उतना छोटा होगा, मुझे इसे बिना किसी प्रारूप के वास्तविक और गंदे सामान के लिए पसंद है। उपयोगकर्ता नियंत्रण दृष्टिकोण भी बहुत अच्छा है, शायद यह थोड़ा सा वोट दिया जाता है। आपके विचारों के लिए सभी को धन्यवाद ... –

+0

व्यक्तिगत रूप से मैं इसके लिए ग्रिड का उपयोग करता हूं लेकिन आप सबसे कम XAML के लिए पूछ रहे थे। यदि आप इसे बहुत कुछ करने जा रहे हैं या आप प्रदर्शन में वृद्धि करना चाहते हैं तो मैं एक सूची दृश्य या सूची बॉक्स का उपयोग कर उपयोगकर्ता नियंत्रण कर दूंगा। –

उत्तर

1

यदि आप 3.5sp1 का उपयोग कर रहे हैं तो आप बाध्यकारी में स्ट्रिंगफॉर्मेट का उपयोग कर सकते हैं। कुछ इस तरह काम करना चाहिए ...

<TextBlock Text="{Binding LastLogRun.LogMessageCount, StringFormat={}Log Count - {0}}" /> 
1

शायद आपको अपने यूआई पर पुनर्विचार करना चाहिए। आप एक ही पंक्ति पर लेबल - टेक्स्टबॉक्स क्यों चाहते हैं? यह अंतरिक्ष का एक भयानक अपशिष्ट है।

टेक्स्टबॉक्स पर लेबल क्यों नहीं? तो फिर तुम एक सरल यूआई और सरल XAML मिल गया है:

<StackPanel Orientation="Vertical"> 
    <TextBlock>Name</TextBlock> 
    <TextBox /> 
    <TextBlock>Age</TextBlock> 
    <TextBox /> 
    <TextBlock>Mood</TextBlock> 
    <TextBox /> 
</StackPanel> 

अपने TextBlocks के लिए कुछ स्टाइल जोड़ें और आप एक अच्छा, स्वच्छ यूआई मिल गया है, बहुत कम दोहराव के साथ।

+0

जब आप अपना दृष्टिकोण कहीं अधिक बर्बाद कर देते हैं, तो आप स्क्रीन स्पेस को बर्बाद करने के ओपी पर आरोप क्यों लगा रहे हैं? इसके बारे में सोचें: ओपी के दृष्टिकोण के साथ, "नाम" लेबल 42x26 = 1092 पिक्सल लेता है। आपके दृष्टिकोण के साथ, वही लेबल स्क्रीन की पूरी चौड़ाई है, इसलिए मेरे मॉनिटर पर, भले ही मैं आपको पैडिंग = 0 सेट करके एक प्रमुख शुरुआत देता हूं, तो आपका 1440x16 = 23040 पिक्सेल लेता है। आपका लेआउट एक वैध विकल्प है, लेकिन खुद को बच्चा न करें कि यह अचल संपत्ति का कम अपर्याप्त है। –

+0

रैंडोल्फो का समाधान अच्छा है, न कि क्योंकि यह कम स्क्रीन स्पेस का उपयोग करता है, लेकिन क्योंकि इसे अंतर्राष्ट्रीय बनाना आसान है। लेबलबॉक्स के ऊपर लेबल डालकर, अंतर बदलता है और विभिन्न भाषाओं के लिए लेबल की लंबाई बदल जाती है। –

1

आप साझा आकार समूहों का उपयोग दो अच्छी तरह से लाइन-अप स्तंभों की ऑटो-आकार ग्रिड व्यवहार प्राप्त करने के लिए कर सकता है, जबकि अभी भी एक UserControl में जटिलता बाहर निकलने के लिए सक्षम किया जा रहा ।

यहां लेबल किए गए एडिट नियंत्रण का उपयोग करने का एक उदाहरण है जो आप जो खोज रहे हैं वह करेगा। जटिलता सभी UserControl में दूर कर दिया गया है पर निर्भर करता है, और तुम सब करने की जरूरत है StackPanel पर Grid.IsSharedSizeScope स्थापित करने के लिए याद है:

<Window x:Class="WpfApplication5.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication5" 
     Name="Self" Title="Window1" Height="300" Width="300"> 
    <StackPanel Grid.IsSharedSizeScope="True"> 
     <local:LabeledEdit Label="Name"/> 
     <local:LabeledEdit Label="Age" Text="28"/> 
     <!-- and with databinding... --> 
     <local:LabeledEdit Label="Width" 
          Text="{Binding Width, ElementName=Self}"/> 
     <local:LabeledEdit Label="Height" 
          Text="{Binding Height, ElementName=Self}"/> 
    </StackPanel> 
</Window> 

और यहाँ UserControl के लिए स्रोत कोड है। LabeledEdit.xaml:

<UserControl x:Class="WpfApplication5.LabeledEdit" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      Name="Self"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto" SharedSizeGroup="LabeledEdit_Labels"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Label Grid.Column="0" Content="{Binding Label, ElementName=Self}"/> 
     <TextBox Grid.Column="1" Text="{Binding Text, ElementName=Self}"/> 
    </Grid> 
</UserControl> 

LabeledEdit.xaml।सीएस:

using System.Windows; 

namespace WpfApplication5 
{ 
    public partial class LabeledEdit 
    { 
     public static readonly DependencyProperty LabelProperty = 
      DependencyProperty.Register("Label", typeof(object), typeof(LabeledEdit)); 
     public static readonly DependencyProperty TextProperty = 
      DependencyProperty.Register("Text", typeof(string), typeof(LabeledEdit), 
      new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); 

     public LabeledEdit() 
     { 
      InitializeComponent(); 
     } 

     public object Label 
     { 
      get { return GetValue(LabelProperty); } 
      set { SetValue(LabelProperty, value); } 
     } 
     public string Text 
     { 
      get { return (string)GetValue(TextProperty); } 
      set { SetValue(TextProperty, value); } 
     } 
    } 
} 
संबंधित मुद्दे