2009-06-18 11 views
5

Zastanawiam się, który jest najlepszy i najszybszy sposób, aby uzyskać dobrze znane wejście Label [lub wyjście, nie ma znaczenia] połączenie w WPF. Jest to proste zadanie, wystarczy pomyśleć o szybkim wyjściu "obiekt" ME:WPF - najlepsza praktyka dla run-of-the-mill [Label: Input] Control


Name - Christian

Wiek - 28

Mood - Good


I wiem, mogę użyć siatki z TextBlocks. Ale szczerze mówiąc, "krótki" XAML to prawie pół strony (RowDefinitions, ColDefs, Grid.Col na każdej etykiecie)

Alternatywny sposób, wykorzystując trzy StackPanele (poziomy) z jedną pionową, wydaje się być również trochę głupi. W tym przypadku muszę nadać każdej etykiecie stałą szerokość, aby uzyskać poprawne wcięcie. I po prostu nie "czuje" się dobrze.

Tak więc, biorąc pod uwagę powyższą sytuację, dostałeś niestandardowy obiekt z 3-6 Właściwościami, które chcesz zrzucić jako tylko do odczytu z GUI, jak byś to zrobił (w WPF, Silverlight też, jeśli naprawdę jesteś w nastrój :).

Mogę, oczywiście, napisać do tego sterowanie użytkownika. Ale dlaczego wyważać otwartych drzwi, czy to może być już tam ...

I wreszcie, aby zilustrować jeszcze dalej, na przykład właśnie utworzona w prawdziwym życiu i było powodem tego postu:

 <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

Wydaje się, że prosisz o dwie rzeczy "najlepsze/najlepsze praktyki" i "najszybsze/szybkie wyjście/zrzuty". Który chcesz? Bryan A. daje szybkie rozwiązanie, a Joe W. daje dobre rozwiązanie do formatowania, które odrzucisz w swoim pytaniu ... – micahtan

+0

Tak, masz rację, nie było najlepszym pytaniem w historii. Myślę, że Bryan A. Answer jest tak krótki, jak to tylko możliwe, lubię go za szybkie i brudne rzeczy bez formatowania. Podejście kontrolujące użytkownika jest również bardzo przyjemne, być może jest trochę podnoszone. Dziękuję wszystkim za twoje pomysły ... –

+0

Osobiście staram się używać Gridów do tego, ale wydawałeś się prosić o najkrótszy XAML. Jeśli masz zamiar robić to dużo lub chcesz zwiększyć wydajność, zrobię Kontrola Użytkownika za pomocą ListView lub ListBox. –

Odpowiedz

1

Jeśli używasz 3.5sp1, możesz użyć StringFormat w powiązaniu. Coś jak to powinno działać ...

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

Być może powinieneś przemyśleć swój interfejs użytkownika. Dlaczego chciałbyś Label - Textbox na tej samej linii? To straszliwa strata przestrzeni.

Dlaczego nie Label przez texbox? Wtedy masz prosty interfejs i proste XAML:

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

dodać kilka stylizacji dla TextBlocks i masz ładne, czyste UI, bardzo mało powtórzeń.

+0

Dlaczego oskarżasz OP o marnowanie miejsca na ekranie, kiedy twoje podejście marnuje o wiele więcej? Pomyśl o tym: z podejściem OP etykieta "Nazwa" zajmuje 42x26 = 1092 piksele. Przy twoim podejściu ta sama etykieta jest pełną szerokością ekranu, więc na moim monitorze, nawet jeśli dam ci przewagę przez ustawienie Padding = 0, twoja ma 1440x16 = 23040 pikseli. Twój układ jest uzasadnioną opcją, ale nie oszukuj się, że to mniej marnotrawstwa nieruchomości. –

+0

Rozwiązanie Randolpho jest dobre, nie dlatego, że wykorzystuje mniej miejsca na ekranie, ale dlatego, że łatwiej jest umiędzynarodowić. Umieszczając etykietę powyżej ramki TextBox, odstępy zmieniają się, a długość etykiet zmienia się dla różnych języków. –

1

Można używać wspólnych grup wielkości, aby uzyskać automatycznego doboru siatki zachowanie dwóch ładnie wyłożone-up kolumn, a jednocześnie jest w stanie wyciągnąć złożoność w UserControl .

Oto przykład użycia formantu LabeledEdit, który zrobiłby to, czego szukasz. Złożoność wszystko zostało uwzględnione dala do UserControl, a wszystko co musisz zrobić, to pamiętać, aby ustawić Grid.IsSharedSizeScope na 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> 

A oto kod źródłowy dla UserControl. OznaczoneEdit.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); } 
     } 
    } 
} 
Powiązane problemy