WPF - 普通[标签:输入]控制的最佳实践

时间:2009-06-18 21:18:13

标签: wpf text controls label

我想知道,这是获得WPF中众所周知的标签输入[或输出,无关紧要]组合的最佳和最快捷方式。它是一个简单的任务,只需要想一下“对象”ME的快速输出:


姓名 - 基督徒

年龄 - 28

心情好 -


我知道,我可以使用带有TextBlocks的Grid。但说实话,这个“短”XAML的长度接近半页(每个标签上的RowDefinitions,ColDefs,Grid.Col)

另一种方法,使用三个StackPanels(水平)和一个垂直方向似乎也有点愚蠢。在这种情况下,我必须给每个Label一个固定的宽度,以使缩进正确。而且它并没有“感觉”正确。

所以,考虑到上面的情况,你得到一个自定义对象,只需要3-6属性,你只想以只读方式转储到你的GUI,你会怎么做(在WPF,Silverlight中,如果你真的心情很好:)

我当然可以为此编写一个usercontrol。但是,为什么重新发明轮子,如果它可能已经在那里......

最后,为了进一步说明,我刚才在现实生活中创造的例子就是这篇文章的原因:

      <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>

4 个答案:

答案 0 :(得分:1)

也许您应该重新考虑您的用户界面。为什么要将Label-Textbox放在同一行?这是一种可怕的浪费空间。

为什么不将标记在 texbox上?然后你有一个简单的UI 简单的XAML:

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

为你的TextBlocks添加一些样式,你有一个漂亮,干净的用户界面,几乎没有重复。

答案 1 :(得分:1)

如果您使用的是3.5sp1,则可以在绑定中使用StringFormat。这样的事情应该有用......

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

答案 2 :(得分:1)

您可以使用共享大小组来获取两个排列良好的列的自动调整网格行为,同时仍然能够将复杂性提取到UserControl中。

以下是使用LabeledEdit控件的示例,该控件可以执行您要查找的内容。复杂性已全部考虑到UserControl中,您需要做的就是记住在StackPanel上设置Grid.IsSharedSizeScope:

<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>

这是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); }
        }
    }
}

答案 3 :(得分:0)

silverlight toolkit有一个DataForm控件非常酷!