Frage

Ich frage mich, was die beste und schnellste Weg ist das bekannte Label-Eingang zu erhalten [oder Ausgang, spielt keine Rolle] Kombination in WPF. Es ist eine einfache Aufgabe, man denke nur an einem schnellen Ausgang des „Objekt“ ME:


Name - Christian

Alter - 28

Mood - Gut


Ich weiß, ich habe ein Gitter mit Textblöcken verwenden kann. Aber um ehrlich zu sein, die „kurze“ XAML dafür ist fast eine halbe Seite lang (RowDefinitions, ColDefs, Grid.Col für jedes Label)

Der alternative Weg, mit drei StackPanels (horizontal) mit einer vertikalen scheint auch ein wenig dumm. In diesem Fall muss ich jedes Etikett eine feste Breite geben, erhalten die Gedankenstrich richtig. Und es funktioniert einfach nicht „fühlen“ rechts.

So, angesichts der Situation oben, haben Sie ein benutzerdefiniertes Objekt mit 3-6 Eigenschaften einfach wie nur lesbar auf Ihre GUI-Dump wollen, wie würden Sie es tun (in WPF, Silverlight auch, wenn Sie wirklich in der Stimmung sind, :).

Ich kann natürlich ein Usercontrol für diesen schreiben. Aber warum das Rad neu erfinden, wenn es vielleicht schon da sein ...

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

      <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>
War es hilfreich?

Lösung

Wenn Sie mit 3.5sp1 Sie String in die Bindung einsetzen können. So etwas sollte funktionieren ...

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

Andere Tipps

Vielleicht sollten Sie Ihre UI überdenken. Warum wollen Sie beschriften - Textbox auf der gleichen Linie? Das ist eine schreckliche Verschwendung von Speicherplatz.

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

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

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

Sie können gemeinsam genutzte Größengruppen verwenden, um das Auto-Sizing Grid Verhalten von zwei gut-aufgereihten Spalten zu bekommen, während immer noch die Komplexität in ein Benutzersteuerelement herausziehen zu können.

Hier ist ein Beispiel für eine LabeledEdit Steuerung verwenden, das tun würde, was Sie suchen. Die Komplexität wurde alles berücksichtigt weg in die Usercontrol, und alles, was Sie tun müssen, ist daran erinnern 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); }
        }
    }
}

Die Silverlight-Toolkits eine Dataform Kontrolle, die ziemlich cool funktioniert!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top