2009-06-18 6 views
5

Ich frage mich, welcher der beste und schnellste Weg ist, um die bekannte Label Input [oder Output, egal] Kombination zu erhalten in WPF. Es ist eine einfache Aufgabe, man denke nur an einem schnellen Ausgang des "Objekt" ME:WPF - Best Practice für den Normalbetrieb [Label: Input] Control


Name - Christian

Alter - 28

Mood - Gut


I weiß, ich kann ein Grid mit TextBlocks verwenden. Aber um ehrlich zu sein, das "kurze" XAML dafür ist fast eine halbe Seite lang (RowDefinitions, ColDefs, Grid.Col auf jedem Etikett)

Die alternative Möglichkeit, mit drei StackPanels (horizontal) mit einer vertikalen scheint auch ein ein bisschen dumm. In diesem Fall muss ich jedem Etikett eine feste Breite geben, damit der Einzug korrekt ist. Und es fühlt sich einfach nicht richtig an.

Also, in Anbetracht der Situation oben, haben Sie ein benutzerdefiniertes Objekt mit 3-6 Eigenschaften, die Sie einfach nur in Ihrer GUI als dump ausgeben möchten, wie würden Sie es tun (in WPF, Silverlight auch, wenn Sie wirklich in der Stimmung :).

Ich kann natürlich ein usercontrol dafür schreiben. Aber warum das Rad neu erfinden, wenn es schon da sein könnte ...

Und schließlich noch weiter zu veranschaulichen, das Beispiel, das ich nur im wirklichen Leben geschaffen und war der Grund für diesen Beitrag:

 <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

Sie scheinen nach zwei Dingen zu fragen: "Best/Best-Practices" und "Quickest/Quick Output/Dump". Welchen willst du? Bryan A. gibt Ihnen eine schnelle Lösung, und Joe W. gibt Ihnen eine gute Formatierungslösung, die Sie in Ihrer Frage ablehnen ... – micahtan

+0

Ja, Sie haben Recht, war nicht die beste Frage überhaupt. Ich denke, die Bryan A. Antwort ist so kurz, wie es wird, ich mag es für echte, schnelle und dreckige Sachen ohne Formatierung. Der User-Control-Ansatz ist auch sehr nett, vielleicht wird er ein wenig aufgeräumt. Vielen Dank für Ihre Ideen ... –

+0

Persönlich neige ich dazu, Grids zu verwenden, aber Sie schienen nach dem kürzesten XAML zu fragen. Wenn Sie viel tun oder die Leistung erhöhen möchten, würde ich ein Benutzersteuerelement mithilfe einer ListView oder ListBox erstellen. –

Antwort

1

Wenn Sie 3.5sp1 verwenden, können Sie StringFormat in der Bindung verwenden. So etwas sollte funktionieren ...

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

Vielleicht sollten Sie Ihre Benutzeroberfläche überdenken. Warum möchten Sie Label - Textbox in derselben Zeile? Das ist eine schreckliche Verschwendung von Raum.

Warum nicht Label über texbox? Dann haben Sie eine einfache Benutzeroberfläche und einfache XAML bekommen:

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

Fügen Sie etwas Styling für Ihre Textblocks und Sie haben eine schöne, saubere UI bekommen, mit sehr wenig Wiederholung.

+0

Warum beschuldigen Sie OP, Bildschirmplatz zu verschwenden, wenn Ihr Ansatz viel mehr verschwendet? Denken Sie darüber nach: Mit dem Ansatz von OP nimmt ein Label "Name" 42x26 = 1092 Pixel ein. Bei Ihrem Ansatz ist das gleiche Label die gesamte Breite des Bildschirms. Wenn Sie also auf dem Monitor Padding = 0 eingeben, wird 1440x16 = 23040 Pixel benötigt. Ihr Layout ist eine legitime Option, aber machen Sie sich nichts vor, dass es weniger Verschwendung von Immobilien ist. –

+0

Randolphos Lösung ist gut, nicht weil sie weniger Platz benötigt, sondern weil sie einfacher zu internationalisieren ist. Wenn Sie die Beschriftung über die TextBox setzen, ändert sich der Abstand und die Länge der Beschriftungen ändert sich für verschiedene Sprachen. –

1

Sie könnten geteilt Größengruppen verwenden, um das Auto-Sizing Grid Verhalten von zwei gut-aufgereihten Spalten zu bekommen, während noch in der Lage, die Komplexität in einen Usercontrol zu ziehen .

Hier ist ein Beispiel für die Verwendung eines LabeledEdit-Steuerelements, das tun würde, was Sie suchen. Die Komplexität wird alles weg in die Usercontrol einkalkuliert, und alles, was Sie tun müssen, ist, erinnert Grid.IsSharedSizeScope auf dem Stackpanel zu setzen:

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

Und hier ist der Quellcode für das 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); } 
     } 
    } 
}