2010-06-20 24 views
7

Tôi có một ListView mà đi một cái gì đó như thế này:Chế độ xem danh sách WPF có đường viền một pixel xung quanh bảng điều khiển bố cục bên trong. Làm sao để tôi bỏ nó đi?

<ListView 
    x:Name="SeriesListView" 
    SnapsToDevicePixels="True" 
    ItemsSource="{Binding Items}" 
    BorderBrush="Transparent" BorderThickness="0" 
    Padding="0" Margin="0" 
    VerticalContentAlignment="Top" 
    Background="Purple" 
    LostFocus="ListView_LostFocus" 
    > 

    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <local:LDSeriesPanel 
       SnapsToDevicePixels="True" 
       MaxWidth="{Binding ElementName=itControl,Path=ActualWidth}" 
       VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
       MinHeight="{x:Static local:LDSeriesPanel.MIN_HEIGHT}" 
       MinWidth="{x:Static local:LDSeriesPanel.MIN_WIDTH}" 
       Margin="0" 
       Background="Aquamarine"/> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 

Khi nó trống rỗng, Width và Height của bảng điều khiển tùy chỉnh tôi đã xác định là 15 x 15. Tôi có thể khẳng định đây là những khía cạnh thực tế trong thời gian chạy . Tuy nhiên, bản thân ListView có kích thước 17 x 17 (nghĩa là, một đường viền một pixel giữa bảng điều khiển và ListView).

Bắt đầu từ bảng điều khiển tùy chỉnh và đi bộ lên cây, tôi nhận được tổ tiên sau:

  • ItemsPresenter: 15x15
  • ScrollViewer: 15x15
  • Lưới: 15x15
  • ScrollViewer: 15x15
  • Đường viền: 17x17
  • Danh sáchXem: 17x17

Nếu tôi thay đổi Đệm trên ListView thành -1, nó sẽ loại bỏ đường viền nhưng gây ra một số vấn đề khác.

Tôi hy vọng tránh được việc xem xét toàn bộ ListView. Mọi thứ khác đều hoạt động tốt. Có cách nào tôi có thể loại bỏ biên giới một pixel này, có lẽ thông qua một phong cách?

Trả lời

2

Tôi vừa xem mẫu mặc định cho ListView, thực tế là Border có lớp đệm rõ ràng là 1 ... vì vậy tôi không nghĩ bạn có thể làm điều đó mà không xác định lại mẫu. Dù sao, nó không phải là rất khó khăn: chỉ cần sao chép mẫu mặc định bằng cách sử dụng một công cụ như StyleSnooper hoặc ShowMeTheTemplate (tôi nghĩ rằng Blend có thể làm điều đó quá), và thay đổi những gì bạn cần ...

+0

Grrr .... ok. :( –

+1

Tôi đã kết thúc bằng cách sử dụng ListBox thay vào đó, nhưng tôi sẽ cung cấp cho bạn dấu kiểm. Cạnh tranh khốc liệt về câu hỏi này ...;) –

8

Nó thực sự đơn giản, nếu bạn có pha trộn bạn có thể nhấp chuột phải vào listview và chọn để chỉnh sửa các mẫu và loại bỏ các padding từ biên giới. Bạn có thể làm điều này trực tiếp trong xaml. Vì tôi muốn tất cả các bản xem trước của tôi không có đường viền này, tôi tạo một tệp tài nguyên có tên là MyprojectnameResources.xaml trong thư mục gốc của dự án với nội dung này.

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<ControlTemplate x:Key="ListViewNewTemplate" TargetType="{x:Type ListBox}"> 
    <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="0" SnapsToDevicePixels="True"> 
     <ScrollViewer Focusable="False" Padding="{TemplateBinding Padding}"> 
      <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
     </ScrollViewer> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
     </Trigger> 
     <Trigger Property="IsGrouping" Value="True"> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="False"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 
<!-- Resource dictionary entries should be defined here. --> 

Sau đó, bạn chỉ có thể sử dụng mẫu này với bất kỳ listview bạn muốn

<ListView Width="1020" Height="764" ItemsSource="{Binding Destinations}" ItemTemplate="{DynamicResource DestinationDataTemplate}" Canvas.Top="0" Canvas.Left="0" BorderThickness="0" Template="{DynamicResource ListViewNewTemplate}" /> 
+0

Đó là Padding ngớ ngẩn = "1" trên biên giới. Thay đổi nó thành Padding = "0" là giải pháp. – DaleyKD

5

Một giải pháp nhanh chóng và dơ bẩn (nhấn mạnh vào "bẩn"):

<ListView Padding="-1" /> 
+0

Cảm ơn bạn vì điều này! Hoạt động hoàn hảo trong WinRT. –

3

Giải pháp đơn giản nhất đối với tôi là đặt độ dày của đường viền thành 0, như:

<ListBox BorderThickness="0" /> 

Không yêu cầu mẫu ...

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