WPF - أفضل الممارسات ل[التسمية: الإدخال] الاستعداد للأهمية انعقاد مطحنة تحكم

StackOverflow https://stackoverflow.com/questions/1015226

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا أتساءل، الذي هو أفضل وأسرع طريقة للحصول على تسمية الإدخال المعروفة [أو الإخراج، لا يهم] الجمع في برنامج الأغذية العالمي. لها مهمة بسيطة، مجرد التفكير في انتاج سريع من "وجوه" ME:


والاسم - المسيحي

والعمر - 28

والمزاج - جيد


وأنا أعلم، ويمكنني أن استخدام الشبكة مع TextBlocks. ولكن لنكون صادقين، وXAML "القصير" لهذا هو ما يقرب من نصف صفحة طويلة (RowDefinitions، ColDefs، Grid.Col على كل تسمية)

والطريقة البديلة، وذلك باستخدام ثلاثة StackPanels (أفقي) مع واحد عمودي يبدو أيضا غبي قليلا. في هذه الحالة، لا بد لي من إعطاء كل تسمية عرض ثابت، للحصول على المسافة البادئة صحيحة. وانها فقط لا "يشعر" الصحيح.

وهكذا، وبالنظر إلى الحالة أعلاه، كنت حصلت على كائن مخصص مع 3-6 خصائص كنت ترغب فقط في تفريغ كما للقراءة فقط إلى واجهة المستخدم الرسومية الخاصة بك، كيف يمكنك أن تفعل ذلك (في WPF و Silverlight أيضا، إذا كنت حقا في مزاج :)

ويمكن أنا، بالطبع، والكتابة على UserControl لهذا الغرض. ولكن لماذا إعادة اختراع العجلة، إذا أنه قد يكون هناك بالفعل ...

وأخيرا، لتوضيح أكثر من ذلك، المثال الذي أنشأته للتو في واقع الحياة، وكان السبب لهذا المنصب:

      <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>
هل كانت مفيدة؟

المحلول

إذا كنت تستخدم 3.5sp1 يمكنك استخدام StringFormat في الربط. شيء من هذا القبيل يجب أن تعمل ...

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

نصائح أخرى

وربما يجب عليك إعادة التفكير UI الخاصة بك. لماذا تريد تسمية - مربع نص على نفس الخط؟ هذا هو مضيعة رهيبة من الفضاء.

لماذا لا تسمية <م> على texbox؟ ثم كنت قد حصلت على واجهة مستخدم بسيطة <م> و XAML بسيط:

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

وإضافة بعض التصميم لTextBlocks وكنت قد حصلت على لطيفة، UI نظيفة، مع التكرار القليل جدا.

هل يمكن استخدام مجموعات حجم مشتركة للحصول على الشبكة السلوك التحجيم السيارات من عمودين لطيف مبطنة متابعة، في حين لا تزال قادرة على سحب التعقيد إلى على UserControl.

إليك مثال باستخدام عنصر تحكم LabeledEdit التي من شأنها أن تفعل ما كنت تبحث عنه. وكل روعي تعقيد بعيدا في في UserControl، وكل ما عليك القيام به هو تذكر لوضع Grid.IsSharedSizeScope على StackPanel:

<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.cs:

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); }
        }
    }
}

أدوات سيلفرلايت لها <لأ href = "http://silverlight.codeplex.com /Wiki/View.aspx؟title=Silverlight٪20Toolkit٪20Overview٪20Part٪205 "يختلط =" نوفولو noreferrer "> DataForm التحكم التي تعمل بارد جدا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top