0

コンテンツ コントロールのサイズを動的に調整できるようにしたいと考えています。

簡単な例を次に示します。

...
<Slider x:Name="width" Minimum="40" Value="100" Maximum="300"/>
...
<ContentPresenter Width="{Binding Value, ElementName=width}" Content="Some value">
   <ContentPresenter.ContentTemplate>
      <DataTemplate>
         <Grid MaxWidth="200" MinWidth="80">
            <Rectangle Fill="Wheat" />
            <TextBlock Text="{Binding}"/>
         </Grid>
      </DataTemplate>
   </ContentPresenter.ContentTemplate>
</ContentPresenter>

この例では、コンテンツ ContentPresenter の幅を、生成された子の最小幅と最大幅 (この場合は 80 ~ 200) 以内に収めたいと考えています。

明らかに、このような単純な例では、スライダーの範囲を変更するだけで済みますが、実際のシナリオはもっと複雑です。ポップアップ画面のサイズを生成されたコンテンツに制限しようとしています。コンテンツがどのようなものになるか事前にわからないため、ポップアップに明示的な範囲を設定することはできません。コンテンツはそれ自体を制限できる必要があります。

残念ながら、子の MaxWidth と MinWidth はほとんど無視されます。親が小さく設定されている場合、MinWidth はトリミングされます。MaxWidth を使用すると、多くの空きスペースが生じます。Width 値を動的に更新しているのと同じ場所に MaxWidth と MinWidth を設定する必要があるようです。

4

1 に答える 1

0

私の提案は、ContentPresenter をカスタム パネルに置き換えることです (代わりに、カスタム パネルを置き換えることができない場合は、ContentPresenter にカスタム パネルを囲みます)。Panel から派生したクラスを宣言し、MeasureOverride と ArrangeOverride をオーバーライドするのは非常に簡単です。この場合、ベース MeasureOverride を使用してすべてを測定し、必要なサイズを使用可能なスペースとして割り当てることができます。ArrangeOverride では、パネルの直接の子を割り当てて、パネルの最終的なサイズ (rect = 0,0,width,height) にします。

于 2011-05-13T18:42:15.470 に答える