2009-06-18 10 views
5

Mi chiedo, qual è il modo migliore e più rapido per ottenere la ben nota Label Input [o output, non importa] combinazione in WPF. Il suo un compito semplice, basta pensare a una rapida uscita dell ' "oggetto" ME:WPF - Best Practice per il controllo run-of-the-mill [Etichetta: Input]


Nome - Christian

Età - 28

Mood - Buona


I so, posso usare una griglia con TextBlocks. Ma per essere onesti, lo XAML "corto" per questo è di circa mezza pagina (RowDefinitions, ColDefs, Grid.Col su ciascuna etichetta)

Il modo alternativo, utilizzando tre StackPanel (orizzontale) con una verticale sembra anche un un po 'stupido. In questo caso, devo dare a ciascuna etichetta una larghezza fissa, per ottenere la correzione corretta. E semplicemente non "sente" giusto.

Quindi, data la situazione di cui sopra, hai un oggetto personalizzato con 3-6 proprietà che vuoi semplicemente scaricare come readonly nella tua GUI, come lo faresti (in WPF, anche Silverlight, se sei veramente nel umore :).

Posso, ovviamente, scrivere un controllo elettronico per questo. Ma perché reinventare la ruota, se potrebbe essere già lì ...

E, infine, per illustrare ancora di più, l'esempio che ho appena creato nella vita reale ed è stato il motivo di questo post:

 <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

Sembra che tu stia chiedendo due cose: "best/best-practice" e "output/dump più veloce/veloce". Quale volete? Bryan A. ti offre una soluzione rapida e Joe W. ti offre una buona soluzione di formattazione che tu rifiuti nella tua domanda ... – micahtan

+0

Sì, hai ragione, non era la migliore domanda di sempre. Penso che la risposta di Bryan A. sia più breve che mai, mi piace per cose veramente veloci e sporche senza formattazione. Anche l'approccio per il controllo degli utenti è molto bello, forse viene votato un po '. Grazie a tutti per le tue idee ... –

+0

Personalmente tendo ad usare Grids per questo, ma mi sembra che tu stia chiedendo il XAML più corto. Se lo farai molto o vuoi aumentare le prestazioni, farei un controllo utente usando ListView o ListBox. –

risposta

1

Se si utilizza 3.5sp1, è possibile utilizzare StringFormat nell'associazione. Qualcosa del genere dovrebbe funzionare ...

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

Forse dovresti ripensare all'interfaccia utente. Perché vorresti Label - Textbox sulla stessa riga? Questa è un'orrenda perdita di spazio.

Perché non etichetta su texbox? Poi hai una semplice interfaccia utente e semplice XAML:

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

Aggiungi un po 'di stile per i vostri TextBlocks e hai una bella, pulita interfaccia utente, con molto poco la ripetizione.

+0

Perché stai accusando OP di sprecare spazio sullo schermo, quando il tuo approccio spreca molto di più? Pensaci: con l'approccio di OP, l'etichetta "Nome" occupa 42x26 = 1092 pixel. Con il tuo approccio, quella stessa etichetta è tutta la larghezza dello schermo, quindi sul mio monitor, anche se ti do un vantaggio, impostando Padding = 0, il tuo prende 1440x16 = 23040 pixel. Il layout è un'opzione legittima, ma non illuderti che sia meno dispendioso degli immobili. –

+0

La soluzione di Randolpho è buona, non perché usa meno spazio sullo schermo, ma perché è più facile da internazionalizzare. Mettendo l'etichetta sopra il TextBox, la spaziatura cambia e la lunghezza delle etichette cambia per lingue diverse. –

1

Si potrebbe utilizzare gruppi di dimensioni condivise per ottenere l'auto-dimensionamento comportamento Griglia di due colonne ben-allineati-up, pur essendo in grado di tirare fuori la complessità in un UserControl .

Ecco un esempio di utilizzo di un controllo LabeledEdit che farebbe ciò che stai cercando. La complessità è stato tutto presi via nella UserControl, e tutto quello che dovete fare è ricordarsi di impostare Grid.IsSharedSizeScope sul 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> 

Ed ecco il codice sorgente per l'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); } 
     } 
    } 
}