Pregunta

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, solo piense en una salida rápida del " objeto " YO:


Nombre - Cristiano

Edad - 28

Estado de ánimo: bueno


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

La forma alternativa, usar tres StackPanels (horizontal) con una vertical también parece un poco estúpido. En este caso, tengo que dar a cada etiqueta un ancho fijo para que la sangría sea correcta. Y simplemente no se siente derecha.

Entonces, dada la situación anterior, obtuviste 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 de humor :).

Puedo, por supuesto, escribir un control de usuario para esto. Pero, ¿por qué reinventar la rueda, si es que ya está allí ...

Y finalmente, para ilustrar aún más, el ejemplo que acabo de crear en la vida real y fue el motivo de esta publicación:

      <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>
¿Fue útil?

Solución

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}}" />

Otros consejos

Quizás deberías repensar tu interfaz de usuario. ¿Por qué querrías Label - Textbox en la misma línea? Esa es una horrible pérdida de espacio.

¿Por qué no etiquetar sobre texbox? Entonces tienes una interfaz de usuario simple 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 obtendrá una interfaz de usuario agradable y limpia, con muy poca repetición.

Puede usar grupos de tamaños compartidos para obtener el comportamiento de cuadrícula de tamaño automático de dos columnas bien alineadas, sin dejar de extraer la complejidad en un UserControl.

Aquí hay un ejemplo del uso de un control La LabelEdit que haría lo que está buscando. La complejidad se ha incluido en el UserControl, y todo lo que necesita hacer es recordar configurar 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 UserControl. La LabelEdit.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>

La LabelEdit.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); }
        }
    }
}

El kit de herramientas silverlight tiene un DataForm ¡control que funciona muy bien!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top