2009-06-18 10 views
5

よく知られているラベル入力[または出力、重要ではない]の組み合わせを取得するには、 WPFで。そのシンプルなタスクは、単に "オブジェクト" の迅速な出力を考えるME:WPF - 慣行のベストプラクティス[ラベル:入力]コントロール


名 - クリスチャン

年齢 - 28

ムード - グッド


I知っている、私はTextBlocksとグリッドを使用することができます。しかし、正直言って、このための "短い" XAMLはページの半分近くです(各ラベルのRowDefinitions、ColDefs、Grid.Col)

もう1つの方法では、1つの縦に3つのStackPanels少し馬鹿。この場合、インデントが正しくなるように、各ラベルに固定幅を設定する必要があります。そして、それはちょうど "感じ"しません。

上記の状況を考慮すると、GUIに読み込み専用のプロパティを持つカスタムオブジェクトがあります(WPF、Silverlightでも、実際に気分:)。

私は、もちろん、このためのユーザーコントロールを書くことができます。しかし、なぜそれが既にあるかもしれない場合は...、

を車輪の再発明そして最後に、さらに私は実際の生活の中で作成した例を説明し、このポストのための理由だった:

 <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

"ベスト/ベストプラクティス"と "クイック/クイック出力/ダンプ"という2つのことを求めているようです。あなたはどれが欲しいですか?ブライアンA.はあなたにすばやい解決策を提供し、ジョーW.はあなたの質問で却下する良いフォーマットソリューションを提供します... – micahtan

+0

ええ、あなたは正しいです、これまで最高の質問ではありませんでした。私はブライアンA.答えが得られるほど短いと思う、私は書式設定なしで本当の素早く汚いもののためにそれが好きです。ユーザーコントロールのアプローチも非常にいいです、おそらくそれは少し投票されます。あなたのアイデアをお寄せいただきありがとうございます。 –

+0

個人的に私はこのためにグリッドを使用する傾向がありますが、あなたは最短のXAMLを求めているようです。多くのことをやっている場合や、パフォーマンスを向上させたい場合は、ListViewまたはListBoxを使用してユーザーコントロールを作成します。 –

答えて

1

3.5sp1を使用している場合は、バインディングでStringFormatを使用できます。このような何か動作するはずです...

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

おそらくあなたはあなたのUIを考え直すべきでしょう。なぜあなたはLabel - Textboxを同じ行にしたいのですか?それは恐ろしい空間の無駄です。

なぜラベルなし以上テックスボックス?そして、あなたは簡単なUI 簡単なXAML持っている:

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

をお使いのTextBlockのためのいくつかのスタイルを追加すると、非常に少ない繰り返しで、素敵な、きれいなUIを持っています。

+0

なぜあなたのアプローチがはるかに無駄になるときに、画面スペースを無駄にするというOPを訴えているのですか?それについて考える:OPのアプローチでは、 "名前"ラベルは42x26 = 1092ピクセルを占める。あなたのアプローチでは、同じラベルが画面の全幅なので、私のモニターでは、Padding = 0に設定して頭を出しても、1440x16 = 23040ピクセルになります。あなたのレイアウトは合法的な選択肢ですが、不動産の無駄が少なくなるとは思わないでください。 –

+0

Randolphoのソリューションは良いですが、画面のスペースを少なくしているわけではなく、国際化が容易であるためです。 LabelをTextBoxの上に置くと、間隔が変わり、ラベルの長さが言語ごとに変わります。 –

1

まだユーザーコントロールに複雑さを引き出すことが可能でありながら、あなたは、2うまく-並んだ列の自動サイズ変更グリッドの動作を取得するために、共有サイズグループを使用することができます。

ここでは、探しているものを実行するLabeledEditコントロールを使用する例を示します。複雑さは、すべてのユーザーコントロールに離れ織り込まれており、すべてを行う必要があるの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> 

そして、ここでは、ユーザーコントロールのソースコードです。 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); } 
     } 
    } 
} 
関連する問題