2009-06-18 11 views
5
merak ediyorum

, iyi bilinen Etiket Girişini almak için en iyi ve en hızlı yoludur [veya çıkışı, önemli değil] kombinasyonu WPF'de. Onun basit bir görev, sadece "nesne" nin hızlı bir çıkış düşünüyorum ME:WPF - run-of-the-mill [Etiket: Girdi] için En İyi Uygulama Kontrolü


Ad - Christian

Yaş - 28

Mood - İyi


ben biliyorum, TextBlocks ile bir Izgara kullanabilirsiniz. Ama dürüst olmak gerekirse, bunun için "kısa" XAML neredeyse bir sayfa uzunluğundadır (RowDefinitions, ColDefs, her bir etiket üzerindeki Grid.Col)

Üç dikey StackPanels (yatay) bir dikey kullanarak alternatif bir yöntem de görünüyor. biraz aptal. Bu durumda, bir girinti doğru almak üzere, her bir etiket sabit bir genişlik elde gerekir. Ve sadece "hissetme" doğru değil.

Yukarıdaki Durum göz önüne alındığında, 3-6 Özellikleri ile GUI'nize salt okunur olarak dökmek istediğiniz özel bir nesneye sahip olursunuz, bunu nasıl yaparsınız (WPF'de, Silverlight'ta da, gerçekten de ruh hali :).

Ben, tabii, bunun için bir usercontrol yazabilir. Ama neden zaten var mı diye ...

tekerleği yeniden icat Ve son olarak, daha da sadece gerçek hayatta yaratılan örnek göstermek için ve bu yazı nedeni vardı:

 <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

İki şeyi "en iyi/en iyi uygulamalar" ve "en hızlı/hızlı çıktı/dökümü" soruyor gibi görünüyorsunuz. Hangisini istersin? Bryan A. size hızlı bir çözüm sunuyor ve Joe W. size sorgunuzda işten attığınız iyi bir biçimlendirme çözümü sunuyor ... – micahtan

+0

Evet, haklısınız, gelmiş geçmiş en iyi soru değildi. Bryan A. Cevap'ın alacağı kadar kısa olduğunu düşünüyorum, biçimlendirmeden gerçekten hızlı ve kirli şeyler için seviyorum. Kullanıcı kontrol yaklaşımı da çok güzel, belki de biraz oylanıyor. Fikirleriniz için hepinize teşekkürler ... –

+0

Şahsen ben bunun için Izgaraları kullanmayı tercih ediyorum ama en kısa XAML'i soruyor gibiydiniz. Eğer bunu çok yapacaksanız veya performansı arttırmak istiyorsanız, bir ListView veya ListBox kullanarak bir Kullanıcı Denetimi yapacağım. –

cevap

1

Eğer kullanıyorsanız. Hala bir UserControl içine karmaşıklığı çekin mümkün olurken Böyle bir şey,

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

Belki de UI'nizi tekrar düşünmelisiniz. Neden aynı satırda Label - Textbox'ı istiyorsunuz? Bu korkunç bir yer israfı.

Neden texbox üzerinde Etiket? Sonra basit bir kullanıcı arayüzü ve basit XAML var:

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

sizin TextBlocks için bazı stil ekleyin ve çok az tekrarlama ile bir güzel, temiz UI var. Eğer bağlayıcı içinde StringFormat kullanabilirsiniz 3.5sp1

+0

Yaklaşımınız çok daha fazla zaman harcadığında OP'yi ekran alanını boşa harcamayla neden suçluyorsunuz? Bir düşünün: OP'nin yaklaşımı ile bir "İsim" etiketi 42x26 = 1092 piksele kadar çıkıyor. Yaklaşımınızla, aynı etiket ekranın tam genişliğidir, bu yüzden monitörümde, size Padding = 0 ayarlayarak bir kafa başlatsam bile, sizin 1440x16 = 23040 piksel alırsınız. Düzeniniz yasal bir seçenektir, ancak kendinizi daha az israf edilebilecek bir şey olmadığına kendiniz karar vermeyin. –

+0

Randolpho'nun çözümü iyidir, çünkü daha az ekran alanı kullanır, ancak uluslararasılaştırılması daha kolaydır. Etiketi TextBox'un üzerine koyarak, boşluk değişir ve etiketlerin uzunluğu farklı diller için değişir. –

1

iki güzel çizgili makyaj sütunların otomatik boyutlandırma Izgara davranışı elde etmek paylaşılan boyut gruplarını kullanabilirsiniz ... çalışmalıdır .

Burada aradığınızı yapacağını bir LabeledEdit denetimi kullanarak bir örnek. karmaşıklık tüm uzağa UserControl hesaba edilmiş ve yapmanız gereken tüm StackPanel üzerinde Grid.IsSharedSizeScope ayarlamayı unutmayın geçerli:

<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> 

Ve burada UserControl için kaynak kod. 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); } 
     } 
    } 
}