2010-12-31 13 views
10

मैं एक WPF ListBox में आइटम स्टाइल कर रहा हूं, और प्रत्येक आइटम के चारों ओर एक सीमा रखना चाहता हूं। 1 करने के लिए BorderThickness सेट के साथ, उदाहरण के लिए, आसन्न आइटम के बीच शीर्ष पर नीचे के बॉर्डर दोनों तैयार कर रहे हैं और इसलिए "मोटा" पक्ष सीमाओं से दिखाई देते हैं, दिखाया गया है:क्या डब्ल्यूपीएफ आइटम्स कंट्रोल में सीमा-पतन (एला सीएसएस) का अनुकरण करना संभव है?

ListBoxItem border example

आइटम टेम्पलेट है कि इन ListBoxItems का उत्पादन है:

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

मैं करने के लिए "पतन" इन आसन्न सीमाओं, एक कर सकता, चाहते हैं, उदाहरण के लिए through CSS। मुझे पता है कि BorderThickness को बाएं/दाएं/ऊपर/नीचे सीमाओं के लिए अलग से परिभाषित किया जा सकता है, लेकिन यह वांछित नहीं है, जो पहले या अंतिम आइटम की सीमा को प्रभावित करता है।

क्या इसे WPF के साथ पूरा करने का कोई तरीका है? Border की एक संपत्ति मुझे याद आ रही है, या क्या सीमा बनाने के लिए इसे एक अलग दृष्टिकोण की आवश्यकता है?

+0

यदि कोई यहां फिर से मिलता है, तो यहां कुछ हद तक चालाक "ग्रिडलाउट" कार्यान्वयन है: http://daniel-albuschat.blogspot.com.br/2011/07/gridlayout-for-wpf-escape-margin-hell .html – heltonbiker

उत्तर

7

उपयोग BorderThickness="1,0,1,1" और एक DataTrigger जो RelativeSource={RelativeSource Mode=PreviousData} किया जा रहा है के लिए जाँच करता करने के लिए

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

जोड़ सकते हैं nullBorderThickness="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

क्षमा करें मुझे इस पर वापस जाने के लिए इतना लंबा लगा। यह काफी अच्छी तरह से काम करता है, और मैं इसे @ मीलेक के उत्तर को पसंद करता हूं, जबकि इसी तरह, 'AlternationIndex' के उद्देश्य को कुछ हद तक (मेरी राय में) का अत्याचार करता है। स्वीकृत, धन्यवाद। :) –

+0

पिछलीडेटा ट्रिगर ने पहली प्रविष्टि को हटाते समय, मेरे लिए समस्याएं ताज़ा कर दी थीं। ट्रिगर के बजाय, मैंने सूची बॉक्स में 0,1,0,0 सीमा लगाई है, और अगर कोई प्रविष्टि नहीं है तो पूरे सूची बॉक्स को अदृश्य बनाएं। मेरे लिए ठीक काम करता है – Flo

1

एक बात जो दिमाग में आती है वह AlternationIndex का उपयोग करना है। इसके लिए आपको ListBox पर AlternationCount="10000" जैसे कुछ सेट करने की आवश्यकता होगी। उसके बाद आप BorderThickess="1,0,1,1" सेट और एक DataTrigger का उपयोग पहले ListBoxItem

<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

को खोजने के लिए कर सकते हैं आप सीमा परिभाषा

+1

यह सीमाओं को ध्वस्त करता है, लेकिन नीचे-सबसे तत्व से सीमा को हटाने का दुर्भाग्यपूर्ण दुष्प्रभाव है। यह उन समाधानों में से एक जैसा दिखता है जो पहले या अंतिम तत्व की पहचान करने के लिए ट्रिगर का उपयोग करते हैं और इसे अलग से संभालने की आवश्यकता होती है। –

संबंधित मुद्दे