15

我需要从 a for anListBox中指定的内容中浮出一些内容。我正在使用,但内容被限制在边界上。适用于整个视觉树。DataTemplateListBox.ItemTemplateRenderTransformListBoxClipToBoundsFalse

我在某处读到 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's 被模板ScrollViewer中的's 剪裁。ListBox要解决这个问题,我认为您需要ScrollViewer从模板中删除,如果您需要滚动,您可以ListBoxScrollViewer

<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));
}

这个类是密封的,所以你不能从它派生来覆盖这个方法。您将必须实现自己的ScrollContentPresenter(例如MyScrollContentPresenter),并且可能还需要实现自己的实现这项工作(如果您以这种方法返回ScrollViewer,我认为某些低于边界的项目也可能变得可见)MyScrollContentPresenternullListBox

于 2011-02-01T01:51:58.273 回答
-3

我在解决这个问题时偶然发现了一个解决方案。如果在样式模板中将 ScrollViewer 的 Horizo​​ntalScrollMode 和 VerticalScrollMode 更改为“Disabled”,它将分别停止各个方向的剪辑。

编辑:可能不适用于 WPF。我使用 UWP 应用程序进行了测试。有问题的字段是:

ScrollViewer.Horizo​​ntalScrollMode="已禁用"

ScrollViewer.VerticalScrollMode="已禁用"

于 2016-08-18T01:36:53.730 回答