2009-06-18 9 views
5

Me pregunto, cuál es la mejor y más rápida forma de obtener la conocida combinación de entrada de etiqueta [o salida, no importa] en WPF. Es una tarea simple, basta pensar en una salida rápida del "objeto" ME:WPF - Mejores prácticas para el run-of-the-mill [Etiqueta: Entrada] Control


Nombre - Christian

Edad - 28

Mood - Buena


I Sé que puedo usar una cuadrícula con TextBlocks. Pero para ser honesto, el XAML "corto" para esto tiene casi media página (RowDefinitions, ColDefs, Grid.Col en cada etiqueta)

La manera alternativa, usando tres StackPanels (horizontales) con una vertical parece también una un poco estúpido. En este caso, tengo que darle a cada etiqueta un ancho fijo, para que la sangría sea correcta. Y simplemente no "se siente" bien.

Así que, dada la situación anterior, tienes un objeto personalizado con 3-6 propiedades que solo quieres volcar como solo lectura en tu GUI, ¿cómo lo harías? (En WPF, Silverlight también, si realmente estás en el estado animico :).

Puedo, por supuesto, escribir un usercontrol para esto. Pero ¿por qué reinventar la rueda, si puede ser ya allí ...

Y, por último, para ilustrar aún más, el ejemplo que acaba de crear en la vida real y fue el motivo de este 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

Parece que está pidiendo dos cosas "mejores/mejores prácticas" y "salida/descarga más rápida/rápida". ¿Cuál quieres? Bryan A. le ofrece una solución rápida, y Joe W. le ofrece una buena solución de formato que descarta en su pregunta ... – micahtan

+0

Sí, tiene razón, no fue la mejor pregunta de la historia. Creo que la respuesta de Bryan A. es tan breve como sea posible, me gusta para cosas realmente rápidas y sucias sin formato. El enfoque de control del usuario también es muy bueno, tal vez se vota un poco. Gracias a todos por sus ideas ... –

+0

Personalmente tiendo a usar Grids para esto, pero parecían estar pidiendo el XAML más corto. Si vas a estar haciendo mucho o quieres aumentar el rendimiento, yo haría un Control de usuario usando un ListView o ListBox. –

Respuesta

1

Si está utilizando 3.5sp1 puede usar StringFormat en el enlace. Algo como esto debería funcionar ...

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

Tal vez deberías reconsiderar tu UI. ¿Por qué querrías Label - Textbox en la misma línea? Eso es un terrible desperdicio de espacio.

¿Por qué no Etiqueta sobre texbox? Entonces usted tiene una interfaz de usuario sencilla y XAML simple:

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

Agregue un poco de estilo para sus TextBlocks y usted tiene un agradable, limpia interfaz de usuario, con muy poca repetición.

+0

¿Por qué acusa a OP de desperdiciar espacio en la pantalla, cuando su enfoque es mucho mayor? Piénselo: con el enfoque de OP, una etiqueta de "Nombre" ocupa 42x26 = 1092 píxeles. Con su enfoque, esa misma etiqueta es el ancho total de la pantalla, por lo que en mi monitor, incluso si le doy una ventaja al establecer Padding = 0, la suya toma 1440x16 = 23040 píxeles. Su diseño es una opción legítima, pero no se engañe a sí mismo que es menos desperdicio de bienes raíces. –

+0

La solución de Randolpho es buena, no porque use menos espacio en la pantalla, sino porque es más fácil de internacionalizar. Al colocar la etiqueta encima del cuadro de texto, el espacio cambia y la longitud de las etiquetas cambia para diferentes idiomas. –

1

Usted podría utilizar grupos de tamaño compartidos para obtener el comportamiento de cuadrícula de tamaño automático de dos columnas muy bien alineados-up-, sin dejar de ser capaz de sacar la complejidad en un control de usuario .

Aquí hay un ejemplo del uso de un control LabeledEdit que haría lo que está buscando. La complejidad ha sido tomado en cuenta todos los lejos en el control de usuario, y todo lo que tiene que hacer es recordar para establecer Grid.IsSharedSizeScope en el 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> 

Y aquí está el código fuente para el control de usuario. 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); } 
     } 
    } 
} 
Cuestiones relacionadas