15

ListBoxので指定されているように、いくつかのコンテンツをフロートアウトする必要がありDataTemplateますListBox.ItemTemplate。使用していますが、コンテンツが境界RenderTransformでクリップされます。ビジュアルツリー全体用です。ListBoxClipToBoundsFalse

専用のクリッピングプロパティで指定されていない場合でも、WPFが内部でクリッピングを実行することをどこかで読みました。また、使用するとクリッピングの問題が解決する場合があることもわかりましたがCanvas、ここでは役に立ちません。

どうすればこの問題を克服できますか?これが私が修正したいいくつかのXAMLです。長方形の左側全体が欠落していることに注意してください。

    <ListBox>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Rectangle Fill="Red" Stroke="Green" StrokeThickness="4" Width="100" Height="50">
                    <Rectangle.RenderTransform>
                        <TranslateTransform X="-50" />
                    </Rectangle.RenderTransform>
                </Rectangle>
            </DataTemplate>
        </ListBox.ItemTemplate>

        42
    </ListBox>
4

2 に答える 2

24

は、テンプレート内のListBoxItemによってクリップされています。これを回避するには、テンプレートからを削除する必要があると思います。スクロールが必要な場合は、をラップすることができます。ScrollViewerListBoxScrollViewerListBoxScrollViewer

<ScrollViewer HorizontalScrollBarVisibility="Auto"
              VerticalScrollBarVisibility="Auto">
    <ListBox Margin="100,10,0,0">
        <ListBox.Template>
            <ControlTemplate TargetType="{x:Type ListBox}">
                <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1" SnapsToDevicePixels="true">
                    <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsEnabled" Value="false">
                        <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </ListBox.Template>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Rectangle Fill="Red" Stroke="Green" StrokeThickness="4" Width="100" Height="50">
                    <Rectangle.RenderTransform>
                        <TranslateTransform X="-50" />
                    </Rectangle.RenderTransform>
                </Rectangle>
            </DataTemplate>
        </ListBox.ItemTemplate> 42
    </ListBox>
</ScrollViewer>

アップデート

ScrollViewerテンプレート内のは、次のように生成されScrollContentPresenterます。GetLayoutClip

protected override Geometry GetLayoutClip(Size layoutSlotSize)
{
    return new RectangleGeometry(new Rect(base.RenderSize));
}

このクラスはSealedであるため、このクラスから派生してこのメ​​ソッドをオーバーライドすることはできません。ScrollContentPresenterあなたはあなた自身(例えば)を実装しなければならずMyScrollContentPresenter、おそらくあなた自身もこれを機能させるためにScrollViewer使用します(そしてあなたがこのメソッドに戻ると、境界より下のいくつかのアイテムも見えるようになると思います)MyScrollContentPresenternullListBox

于 2011-02-01T01:51:58.273 に答える