WPF- 실행을위한 모범 사례 [레이블 : 입력] 제어
문제
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); }
}
}
}