1

フォーム内のオブジェクトを表示および編集するためのコントロールを作成しています。コントロール ( FormDataView) は、ItemsControl各項目が で構成されるFormFieldコントロールGridで、左側の列にフィールド名、右側の列にエディター (TextBox など) が表示されます。エディターを揃えるために、それぞれの最初の列がGrid同じ幅になるようにします。

だから私はIsSharedSizeScopeandを使用しようとしましSharedSizeGroupたが、うまくいきません。最初の列はそれぞれで幅が異なりますFormField

これらのコントロールのスタイルは次のとおりです。

<Style TargetType="{x:Type ctl:FormDataView}" BasedOn="{StaticResource ResourceKey={x:Type ItemsControl}}">
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Vertical"
                            Grid.IsSharedSizeScope="True"
                            IsItemsHost="True" />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>

<Style TargetType="{x:Type ctl:FormField}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ctl:FormField}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="Auto" SharedSizeGroup="headerColumn" />
                        <ColumnDefinition Width="*" />
                    </Grid.ColumnDefinitions>
                    <ContentPresenter Grid.Column="0"
                                      Content="{TemplateBinding Header}"
                                      Margin="3"
                                      TextElement.FontWeight="Bold" />
                    <ContentPresenter Grid.Column="1"
                                      Name="PART_Display"
                                      ContentTemplate="{TemplateBinding DisplayTemplate}"
                                      Margin="2"/>
                    <ContentPresenter Grid.Column="1"
                                      Name="PART_Editor"
                                      ContentTemplate="{TemplateBinding EditorTemplate}"
                                      Margin="2"
                                      Visibility="Collapsed" />
                </Grid>
                <ControlTemplate.Triggers>
                    <DataTrigger Binding="{Binding IsInEditMode, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ctl:FormDataView}}}"
                                 Value="True">
                        <Setter TargetName="PART_Display" Property="Visibility" Value="Collapsed" />
                        <Setter TargetName="PART_Editor" Property="Visibility" Value="Visible" />
                    </DataTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

が のテンプレートで設定されているのに対し、は でどのようGrid.IsSharedSizeScopeに設定されているかに注目してください。これは、私がやりたいことを正しく表現しています。それぞれが最初の列に同じ幅を使用する必要があります。ただし、プロパティのドキュメントによると、このシナリオはサポートされていません。ItemsPanelFormDataViewSharedSizeGroupFormFieldFormFieldSharedSizeGroup

リソース テンプレート内で IsSharedSizeScope を true に設定し、SharedSizeGroup をそのテンプレートの外部として定義すると、グリッド サイズ共有は機能しません。

わかりました。なぜうまくいかないのか理解できます...しかし、この制限を回避する方法がわかりません。

何か案が?

NB:もちろん、最初の列に固定幅を割り当てたくありません...

4

1 に答える 1

3

残念ながら、Visual Studio 環境にアクセスできないため、次のヒントを確認できませんでした...

  1. Grid.IsSharedSizeScope="True"ではなく、FormDataViewそれ自体に割り当てItemsPanelます。StackPanelアイテムパネルとして本当に必要ですか?それがないと生きていけないの?

上記の変更が最初に機能するかどうかを確認してください...

  1. そうでない場合は、アイテム レベルのコードを修正し、個々の ではなく、SharedSizeGroup="headerColumn"アイテム データ テンプレートに割り当てます。FormDataViewControlTemplateFormField

これが役立つかどうか教えてください....

于 2011-07-30T08:58:14.010 に答える