2010-12-31 23 views
10

Tôi đang tạo kiểu cho các mục trong WPF ListBox và muốn đặt đường viền quanh mỗi mục. Với BorderThickness thiết lập để 1, ví dụ, biên giới trên dưới giữa các mục liền kề đều được rút ra và do đó xuất hiện "dày" hơn so với biên giới phía, như:Có thể mô phỏng sự sụp đổ biên giới (ala CSS) trong WPF ItemsControl không?

ListBoxItem border example

Mục mẫu mà sản xuất những ListBoxItems là:

<DataTemplate> 
    <Border BorderThickness="1" BorderBrush="DarkSlateGray" Background="DimGray" Padding="8 4 8 4">   
    <TextBlock Text="{Binding Name}" FontSize="16"/> 
    </Border> 
</DataTemplate> 

Tôi muốn "thu gọn" các đường viền liền kề này, như có thể, ví dụ: through CSS. Tôi biết rằng BorderThickness có thể được xác định riêng cho đường biên trái/phải/trên/dưới, nhưng điều này cũng ảnh hưởng đến đường viền của mục đầu tiên hoặc cuối cùng, điều này không được mong muốn.

Có cách nào để thực hiện việc này với WPF không? Tài sản của Border Tôi bị thiếu hoặc có yêu cầu một cách tiếp cận khác để tạo biên giới không?

+0

Trong trường hợp bất kỳ ai đến đây một lần nữa, đây là một triển khai "GridLayout" khá thông minh: http://daniel-albuschat.blogspot.com.br/2011/07/gridlayout-for-wpf-escape-margin-hell .html – heltonbiker

Trả lời

7

Sử dụng BorderThickness="1,0,1,1"DataTrigger mà kiểm tra cho RelativeSource={RelativeSource Mode=PreviousData} phúc null để đặt BorderThickness="1,1,1,1":

<Window x:Class="CollapseBordersDemo.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:sys="clr-namespace:System;assembly=mscorlib" 
     Title="MainWindow" Height="239" Width="525"> 
    <Window.Resources> 
    <x:Array x:Key="ListBoxItems" Type="{x:Type sys:String}"> 
     <sys:String>Alice</sys:String> 
     <sys:String>Bob</sys:String> 
     <sys:String>Colleen</sys:String> 
    </x:Array> 
    <DataTemplate x:Key="ListBoxTemplate"> 
     <Border x:Name="Border" BorderThickness="1,0,1,1" BorderBrush="DarkSlateGray" Background="LightGray" Padding="8 4 8 4"> 
     <TextBlock Text="{Binding}" FontSize="16"/> 
     </Border> 
     <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=PreviousData}}" Value="{x:Null}"> 
      <Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,1"/> 
     </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
    </Window.Resources> 
    <Grid> 
    <ListBox ItemsSource="{StaticResource ListBoxItems}" ItemTemplate="{StaticResource ListBoxTemplate}" HorizontalContentAlignment="Stretch" /> 
    </Grid> 
</Window> 
+0

Xin lỗi, tôi đã mất quá nhiều thời gian để quay lại trang này. Điều này làm việc khá tốt, và tôi thích nó với câu trả lời của @ Meleak, trong khi tương tự, tra tấn mục đích của 'AlternationIndex' phần nào (theo ý kiến ​​của tôi). Được chấp nhận, cảm ơn bạn. :) –

+0

Trình kích hoạt PreviousData có sự cố làm mới cho tôi khi tôi xóa mục nhập đầu tiên. Thay vì kích hoạt, tôi đặt một biên giới 0,1,0,0 vào hộp danh sách, và làm cho toàn bộ hộp liệt kê invisble nếu nó không có mục. Làm việc tốt cho tôi – Flo

1

Một điều bạn cần lưu ý là sử dụng AlternationIndex. Điều này sẽ yêu cầu bạn thiết lập một cái gì đó như AlternationCount="10000" trên ListBox. Sau đó bạn có thể đặt BorderThickess="1,0,1,1" và sử dụng một DataTrigger để tìm ListBoxItem đầu tiên

<DataTemplate> 
    <Border x:Name="border" BorderThickness="1,0,1,1" BorderBrush="DarkSlateGray" Background="DimGray" Padding="8 4 8 4">   
    <TextBlock Text="{Binding Name}" FontSize="16"/> 
    </Border> 
    <DataTemplate.Triggers> 
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}}, 
            Path=(ItemsControl.AlternationIndex)}" 
       Value="0"> 
     <Setter TargetName="border" Property="BorderThickness" Value="1,1,1,1"/> 
    </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 
-1

Bạn có thể thêm

Margin="0,0,0,-1" SnapsToDevicePixels="True" 

định nghĩa biên giới

+1

Điều đó làm sụp đổ các đường viền, nhưng có tác dụng phụ không may khi xóa đường viền khỏi phần tử đáy nhất. Có vẻ như một trong các giải pháp sử dụng trình kích hoạt để xác định phần tử đầu tiên hoặc cuối cùng và xử lý nó một cách riêng biệt là bắt buộc. –

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