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

时间:2011-01-31 21:17:40

标签: wpf clipping

我需要按照ListBox中为DataTemplate指定ListBox.ItemTemplate中的某些内容。我使用的是RenderTransform,但内容会在ListBox边界上被剪裁。 <{1}}对于整个可视树都是ClipToBounds

我已经读过WPF内部执行某些裁剪的地方,即使没有使用专用裁剪属性指定也是如此。我还发现使用False有时可以解决剪切问题,但这对此没有帮助。

我该如何克服这个问题?这是我要解决的一些XAML。请注意,缺少矩形的整个左侧部分。

Canvas

2 个答案:

答案 0 :(得分:20)

ListBoxItemScrollViewer模板中的ListBox剪裁了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>

ScrollViewer

更新

模板中的ScrollContentPresenter会生成GetLayoutClip,而后者又会生成protected override Geometry GetLayoutClip(Size layoutSlotSize) { return new RectangleGeometry(new Rect(base.RenderSize)); }

ScrollContentPresenter

此类是密封的,因此您无法从中派生以覆盖此方法。您必须实现自己的MyScrollContentPresenter(例如ScrollViewer)以及可能使用MyScrollContentPresenter的{​​{1}}来实现此功能(如果您返回{{1}在这个方法中,我认为null范围之下的一些项目也可以变得可见“

答案 1 :(得分:-2)

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

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

ScrollViewer.Horizo​​ntalScrollMode = “禁用”

ScrollViewer.VerticalScrollMode = “禁用”