문제

WPF에서 잘 알려진 레이블 입력 [또는 출력] 조합을 얻는 가장 빠르고 가장 빠른 방법 인 궁금합니다. 간단한 작업입니다. "Object"의 빠른 출력을 생각해보십시오.


이름 - 기독교

나이 -28

기분 - 좋아


텍스트 블록이있는 그리드를 사용할 수 있습니다. 그러나 솔직히 말해서, 이것에 대한 "짧은"XAML은 거의 반 페이지 길이입니다 (각 레이블의 rowdefinitions, coldefs, grid.col).

하나의 세로와 함께 3 개의 스택 패널 (수평)을 사용하는 대안적인 방법도 약간 어리석은 것 같습니다. 이 경우, 나는 각 레이블에 고정 너비를 주어서 들여 쓰기를 정확하게해야합니다. 그리고 그것은 단지 "느낌"이 아닙니다.

따라서 위의 상황을 감안할 때, 당신은 당신이 당신의 GUI에 읽기 위해 덤프하고 싶은 3-6 개의 속성을 가진 사용자 정의 객체를 얻었습니다. 어떻게 할 것인가 (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>
도움이 되었습니까?

해결책

3.5SP1을 사용하는 경우 바인딩에서 StringFormat을 사용할 수 있습니다. 이와 같은 것이 작동해야합니다 ...

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

다른 팁

아마도 당신은 당신의 UI를 다시 생각해야합니다. 같은 줄에 레이블 - 텍스트 상자를 원하십니까? 그것은 끔찍한 공간 낭비입니다.

레이블이 아닌 이유는 무엇입니까? ~ 위에 텍스 박스? 그런 다음 간단한 UI가 있습니다 그리고 간단한 XAML :

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

텍스트 블록에 스타일을 추가하면 반복이 거의없는 멋진 UI가 있습니다.

공유 크기 그룹을 사용하여 두 개의 멋지게 늘어선 두 개의 열의 자동 크기 그리드 동작을 얻을 수 있지만 여전히 복잡성을 Usercontrol로 끌어낼 수 있습니다.

다음은 찾고있는 일을 수행하는 LABEDEDIT 컨트롤을 사용하는 예입니다. 복잡성은 모두 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); }
        }
    }
}

그만큼 실버 라이트 툴킷 a 데이터 폼 꽤 시원하게 작동하는 컨트롤!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top