私はWPFカスタムコントロールにかなり慣れていないので、基本的な「LabelEdit」(基本的にはLabelコントロールとTextBox)で遊ぶことから始めました。私は、Text、Label、TextWidth、LabelWidth の 4 つのプロパティをバインドしています (おそらく、実稼働環境で名前を付けるようなものではありませんが、これは私が自分自身を教育できるようにするためです!)。
すべてうまくいくようです。また、一連の LabelEdit コントロールがすべて同じラベル幅を持つことができるように、ラベルのサイズが変更され、「ActualLabelWidth」DependencyProperty が変更されると発生するイベントもあります。LabelEdit の XAML は次のとおりです。
<Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}">
<Grid.RowDefinitions >
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding LabelWidth}" />
<ColumnDefinition Width="{Binding TextWidth}" />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Grid.Row="0" Content="{Binding Label, FallbackValue=LabelEdit}" SizeChanged="Label_SizeChanged" />
<TextBox Grid.Column="1" Grid.Row="0" Text="{Binding Text}" />
</Grid>
...そしてそれを使用する MainWindow の場合:
<ajdata:LabelEdit Text="{Binding Title}" Label="Title:" LabelWidth="{Binding ElementName=lblForename, Path=ActualLabelWidth}" TextWidth="100" />
<ajdata:LabelEdit Text="{Binding Surname}" Label="Surname:" LabelWidth="{Binding ElementName=lblForename, Path=ActualLabelWidth}" TextWidth="300" />
<ajdata:LabelEdit Text="{Binding Forename}" Label="Forename(s):" LabelWidth="Auto" TextWidth="300" Name="lblForename" />
そのため、最大のテキスト部分を持つラベルが他のラベルの幅を設定します。
この問題は、Label にマージン ("0,0,5,0") を与えて TextBox 要素から離すと発生します。この状況では、「自動」幅の LabelEdit は問題なく動作するようです。ただし、バインドされたバージョンは余白を尊重していないようです。これは、要素の TextBox 部分が本来あるべき場所の左側に配置されていることを意味します。
すべてのラベルが余白を考慮して同じ幅になるように、私が何をする必要があるか知っている人はいますか? イベント ハンドラーに追加のコードを挿入することもできると思いますが、可能であれば、XAML にその仕事をさせたいと考えています。どうもありがとう。