7

WPFでよく知られているラベル入力[または出力は関係ありません]の組み合わせを取得するための最良かつ最も迅速な方法はどれか疑問に思っています。これは単純なタスクです。「オブジェクト」ME の簡単な出力を考えてみてください。


名前 - クリスチャン

年齢 - 28

気分 - 良い


TextBlocks で Grid を使用できることはわかっています。しかし、正直なところ、この「短い」XAML はページの半分近くの長さです (各ラベルの RowDefinitions、ColDefs、Grid.Col)。

3 つの StackPanels (水平) と 1 つの垂直を使用する別の方法も、少しばかげているようです。この場合、インデントを正しくするために、各ラベルに固定幅を与える必要があります。そして、それは正しく「感じられない」だけです。

したがって、上記の状況を考えると、GUI に読み取り専用としてダンプしたい 3 ~ 6 個のプロパティを持つカスタム オブジェクトを取得しました。どのようにそれを行いますか (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>
4

4 に答える 4

2

共有サイズ グループを使用して、適切に配置された 2 つの列の自動サイズ変更グリッド動作を取得しながら、複雑さを 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); }
        }
    }
}
于 2009-06-18T21:57:01.817 に答える
1

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

<TextBlock Text="{Binding LastLogRun.LogMessageCount, StringFormat={}Log Count - {0}}" />
于 2009-06-18T21:49:30.193 に答える
0

Silverlight ツールキットには、非常にクールに機能する DataFormコントロールがあります。

于 2009-06-19T06:37:43.017 に答える
0

おそらく、UI を再考する必要があります。同じ行に Label - Textbox が必要なのはなぜですか? それは恐ろしいスペースの無駄です。

texboxにラベルを付けてみませんか? 次に、単純な UIと単純な XAMLを取得します。

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

TextBlocks にスタイルを追加すると、繰り返しがほとんどない、きれいできれいな UI が得られます。

于 2009-06-18T21:25:47.307 に答える