某些计算机中未显示WPF Listbox分隔符

时间:2017-09-05 05:25:33

标签: wpf listbox listboxitem list-separator

我创建了一个自定义ListBox,每个项目用分隔符分隔。我看到一个奇怪的问题。在List项目中,分隔符的厚度不是恒定的。然后我在stackoverflow的建议后使用了 UseLayoutRounding 属性。但现在我看到了另一个问题。某些机器中未显示分隔符。我的意思是,在某些机器上显示或不显示分隔符。

以下是自定义列表框的源代码。

<Window x:Class="CustListBox.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:CustListBox"
            Title="MainWindow" Height="350" Width="525">
        <Window.Resources>
            <local:Manager x:Key="manager"/>
            <Style x:Key="LstStyle" TargetType="{x:Type ListBoxItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListBoxItem">
                            <StackPanel>
                                <ContentPresenter/>
                                <Separator Foreground="Gray"/>
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Resources>
        <Grid>
            <ListBox Name="CustListBox" UseLayoutRounding="True" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Source={StaticResource manager}, Path=UserList}" ItemContainerStyle="{Binding Source={StaticResource LstStyle}}" Margin="26,17,271,27">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                           <StackPanel>                            
                                <TextBlock Text="{Binding Path=FirstName}"/>
                                <TextBlock Text="{Binding Path=SecondName}"/>                            
                            </StackPanel>             
                    </DataTemplate>
                </ListBox.ItemTemplate>               
            </ListBox>
            <ListBox Height="278" HorizontalAlignment="Left" Margin="264,16,0,0" Name="listBox1" VerticalAlignment="Top" Width="218" ItemsSource="{Binding Source={StaticResource manager}, Path=Names}" ItemContainerStyle="{Binding Source={StaticResource LstStyle}}"/>
        </Grid>
    </Window>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CustListBox
{
    class Manager : PropertyChangeNotifier
    {
        public List<UserDetails> UserList { get; set; }
        private int myVar;

        public int MyProperty
        {
            get { return myVar; }
            set { myVar = value; }
        }

        public List<string> Names { get; set; }

        public Manager()
        {
            UserList = new List<UserDetails>(5);
            Names = new List<string>();

            UserDetails usrDtls = new UserDetails();
            usrDtls.FirstName = "First Name";
            usrDtls.SecondName = "Second Name";

            UserList.Add(usrDtls);
            UserList.Add(usrDtls);
            UserList.Add(usrDtls);
            UserList.Add(usrDtls);
            UserList.Add(usrDtls);
            UserList.Add(usrDtls);
            UserList.Add(usrDtls);
            UserList.Add(usrDtls);

            Names.Add("Test Name");
            Names.Add("Test Name");
            Names.Add("Test Name");
            Names.Add("Test Name");
            Names.Add("Test Name");
            Names.Add("Test Name");
            Names.Add("Test Name");
            Names.Add("Test Name");
            Names.Add("Test Name");
            Names.Add("Test Name");
        }
    }
}
namespace CustListBox
{
    class UserDetails
    {
        public string FirstName { get; set; }
        public string SecondName { get; set; }
    }
}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

Separator只是Border,所以请尝试将其替换为:

<Style x:Key="LstStyle" TargetType="{x:Type ListBoxItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBoxItem">
                <StackPanel>
                    <ContentPresenter/>
                    <Border Background="Gray" 
                            Height="1" SnapsToDevicePixels="true"
                            Margin="0,2,0,2"/>
                </StackPanel>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

请注意,SnapsToDevicePixels属性设置为true