我需要按照ListBox
中为DataTemplate
指定ListBox.ItemTemplate
中的某些内容。我使用的是RenderTransform
,但内容会在ListBox
边界上被剪裁。 <{1}}对于整个可视树都是ClipToBounds
。
我已经读过WPF内部执行某些裁剪的地方,即使没有使用专用裁剪属性指定也是如此。我还发现使用False
有时可以解决剪切问题,但这对此没有帮助。
我该如何克服这个问题?这是我要解决的一些XAML。请注意,缺少矩形的整个左侧部分。
Canvas
答案 0 :(得分:20)
ListBoxItem
被ScrollViewer
模板中的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的HorizontalScrollMode和VerticalScrollMode更改为“Disabled”,它将分别停止每个方向的剪裁。
编辑:可能不适用于WPF。我测试了UWP应用程序。有问题的字段是:
ScrollViewer.HorizontalScrollMode = “禁用”
ScrollViewer.VerticalScrollMode = “禁用”