2011-01-31 29 views
13

Tôi cần làm nổi bật một số nội dung ra khỏi số ListBox như được chỉ định trong một DataTemplate cho số ListBox.ItemTemplate. Tôi đang sử dụng RenderTransform nhưng nội dung bị cắt bớt trên các ranh giới ListBox. ClipToBoundsFalse cho toàn bộ cây thị giác.Cắt WPF ngay cả khi không cần cắt bớt - làm thế nào để tắt?

Tôi đã đọc ở đâu đó rằng WPF thực hiện một số thao tác cắt ngay cả khi không có quy tắc nào được chỉ định với các thuộc tính cắt riêng. Tôi cũng đã phát hiện ra rằng sử dụng Canvas đôi khi có thể chữa được vấn đề cắt nhưng nó không giúp đỡ ở đây.

Làm cách nào để khắc phục sự cố này? Đây là một số XAML mà tôi muốn sửa chữa. Xin lưu ý rằng toàn bộ phần bên trái của hình chữ nhật bị thiếu.

<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> 

Trả lời

19

Các ListBoxItem 's đang nhận được cắt bớt bởi ScrollViewer trong ListBox Mẫu. Để làm việc xung quanh này, tôi nghĩ rằng bạn sẽ cần phải loại bỏ các ScrollViewer từ Mẫu và nếu bạn cần di chuyển bạn có thể quấn ListBox trong một 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> 

Cập nhật

Các ScrollViewer trong mẫu sẽ tạo ra một ScrollContentPresenter mà lần lượt có sau GetLayoutClip

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

Cla này ss được niêm phong để bạn không thể lấy được từ nó để ghi đè phương pháp này. Bạn sẽ phải triển khai ScrollContentPresenter của riêng mình (ví dụ: MyScrollContentPresenter) và có thể là của riêng bạn để thực hiện công việc này (và nếu bạn trả lại null trong phương pháp này, tôi nghĩ rằng một số mục bên dưới giới hạn của ListBox có thể hiển thị tốt)

+0

Bạn dường như được tại chỗ trên! Nhưng tôi cần 'ScrollViewer' ở vị trí ban đầu của nó. Bạn có biết những gì là đặc biệt trong thực hiện nội bộ 'ScrollVeiwer' làm tổn thương tôi? Đây có phải là cái gì đó có thể được overriden trong một lớp học có nguồn gốc? Tôi đã đọc ở đâu đó rằng 'GetLayoutClip' là thủ phạm nhưng tôi không thể làm cho nó hoạt động theo cách của tôi. – wpfwannabe

+1

@wpfwannabe: Đã cập nhật câu trả lời của tôi. Bạn đúng rằng 'GetLayoutClip' là vấn đề. Thật không may, lần này nó nằm trong một lớp Sealed ('ScrollContentPresenter'), do đó bạn không thể lấy được từ nó. Theo như tôi biết, nó sẽ mất rất nhiều công việc để có được điều này đi –

+0

Câu trả lời của bạn là tuyệt vời! Giúp đỡ nhiều! Cảm ơn nhiều! Trong thời gian đó, tôi đã sắp xếp lại bố cục của mình khác với một loại 'ListBoxItem' tách cho phép tôi hiển thị nội dung nổi bên trong' ListBox' và do đó tôi không cần toàn bộ malarkey 'ScrollViewer' nữa. Hầu hết mọi người có thể tìm ra một giải pháp khác cho cùng một vấn đề.Lần này tôi đã phải thay đổi khá nhiều mẫu của mình để có được những thứ để làm việc như mong đợi nhưng có vẻ dễ dàng hơn nhiều so với việc phải tạo ra 'ScrollViewer' của riêng tôi. Cảm ơn một lần nữa! – wpfwannabe

-2

Tôi tình cờ gặp phải một giải pháp cho vấn đề này khi làm việc xung quanh nó. Nếu bạn thay đổi HorizontalScrollMode và VerticalScrollMode của ScrollViewer thành "Disabled" trong mẫu kiểu, nó sẽ ngừng cắt theo từng hướng tương ứng.

Chỉnh sửa: Có thể không hoạt động đối với WPF. Tôi đã thử nghiệm bằng ứng dụng UWP. Các lĩnh vực trong câu hỏi là:

ScrollViewer.HorizontalScrollMode = "Disabled"

ScrollViewer.VerticalScrollMode = "Disabled"

+0

Không có tài sản nào như HorizontalScrollMode trong WPF – Walkor

+0

Xin lỗi, nên đã đề cập, tôi đã thử nghiệm nó và làm cho nó hoạt động trong các ứng dụng UWP, và tôi đã giả định nó sẽ áp dụng cho WPF. Đoán không. –

Các vấn đề liên quan