0

非常に広いXAMLコントロールがあります。親のサイズに影響するので、レイアウトを変更したくありません。コントロールがクリップされるかどうかは関係ありませんが、次のようにします。

  1. コントロールをその親の幅にし、
  2. 親の幅に影響を与えたくありません。

関心のある親コントロールのWidthをActualWidthにバインドすることでこれを実現できることはわかっています。ただし、子を無視して親からサイズを取得するパネルなどがあります。

これは星サイズの列を持つグリッド内にあるため、ScrollViewer内に配置するだけでは役に立ちません。ScrollViewerはグリッドを埋めるために成長します。

次の例では、ボタンが中央の列の幅を制御し、テキストブロックが最大でボタンが占めるスペースの量を占めるようにします。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Button Content="asdsadsad" Grid.Row="1" Grid.Column="1"/>
    <TextBlock IsHitTestVisible="True" Opacity="0" Grid.Row="1" Grid.Column="1" Text="sdfsdfdsfdfhfkjahslkjfhsafhsakjhflkjsahflkjsahdflkjhsadfsdfkgljdsfkgjfdsjgdshf" />
</Grid>
4

2 に答える 2

1

TextBlockをキャンバスに配置してから、キャンバスをその境界にクリップすることができます。

    <Canvas Grid.Row="1" Grid.Column="1" ClipToBounds="True">
        <TextBlock IsHitTestVisible="True" Opacity="0.5" Text="sdfsdfdsfdfhfkjahslkjfhsafhsakjhflkjsahflkjsahdflkjhsadfsdfkgljdsfkgjfdsjgdshf" />
    </Canvas>

それがあなたの言いたいことなら。

于 2013-03-17T13:36:58.247 に答える
0

すでに他の回答を受け入れているのを見ましたが、テキスト ブロックのみを参照している場合は、TextTrimming を使用できませんか?

そうでない場合は、必要なサイズを決定するときに子のサイズを明示的に無視できるため、キャンバスよりも単純な Panel サブクラスの方が適しています。あなたはまだ子供たちを測定する必要があります。MeasureOverride でパネルのサイズを決定するときに、それらの「DesiredSize」を無視するだけです。次に、ArangeOverride で、MeasureOverride で指定した最大サイズを尊重します。

その利点は、テキストボックスまたはそのためのコントロールも適切にサイズ設定され、子としてレイアウトされることですが、パネルのサイズには決して影響しません。

必要な MeasureOverride コードは次のとおりです。次に、ArrangeOverride で、必要に応じて子をレイアウトし、必要に応じてクリッピングまたはパネルへの制約を検討することを決定します。(カスタム パネルは、私のお気に入りの WPF の 1 つです。)

protected override Size MeasureOverride(Size availableSize)
{
    // You still measure the children.  You just don't use them when determining the size of the panel.
    foreach(FrameworkElement childElement in this.Children)
    {
        if(childElement.Visibility != Visibility.Collapsed)
            childElement.Measure(availableSize);
    }

    return new Size(
        Double.IsPositiveInfinity(availableSize.Width)  ? 0 : availableSize.Width,
        Double.IsPositiveInfinity(availableSize.Height) ? 0 : availableSize.Height);
}
于 2013-04-04T11:08:31.577 に答える