即使不需要裁剪也可以剪裁WPF - 如何将其关闭?

wpf*_*abe 13 wpf clipping

我需要浮出来一些内容出来的ListBox所指定的DataTemplate一个ListBox.ItemTemplate.我正在使用,RenderTransform但内容被限制在ListBox边界上.ClipToBoundsFalse整个视觉树.

我已经读过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>
Run Code Online (Sandbox Code Playgroud)

Fre*_*lad 21

ListBoxItem的越来越被裁剪ScrollViewerListBox模板.要解决这个问题,我认为你需要ScrollViewer从模板中删除它,如果你需要滚动,你可以将其包装成ListBox一个ScrollViewer

<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>
Run Code Online (Sandbox Code Playgroud)

更新

ScrollViewer在模板会产生ScrollContentPresenter这反过来又具有以下GetLayoutClip

protected override Geometry GetLayoutClip(Size layoutSlotSize)
{
    return new RectangleGeometry(new Rect(base.RenderSize));
}
Run Code Online (Sandbox Code Playgroud)

此类是密封的,因此您无法从中派生以覆盖此方法.你必须实现你自己的ScrollContentPresenter(例如MyScrollContentPresenter),也可能你自己ScrollViewer也使用MyScrollContentPresenter它来完成这项工作(如果你null在这个方法中返回,我认为在这个方法下面的一些项目ListBox也会变得可见)