如何摆脱这个WPF / XAML ListBox填充?

时间:2014-09-27 23:00:15

标签: wpf xaml listbox wpf-controls

我在学习WPF时遇到了一些麻烦,我已经设置了一个自定义UserControl,如下所示:

<UserControl
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:LobbyApp" x:Class="LobbyApp.ChatPanel" 
         mc:Ignorable="d" 
         d:DesignHeight="200" d:DesignWidth="600">
<UserControl.Resources>
    <DataTemplate DataType="{x:Type local:ChatMessage}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition>
                    <ColumnDefinition.Width>Auto</ColumnDefinition.Width>
                    <ColumnDefinition.SharedSizeGroup>Date</ColumnDefinition.SharedSizeGroup>
                </ColumnDefinition>
                <ColumnDefinition>
                    <ColumnDefinition.Width>Auto</ColumnDefinition.Width>
                    <ColumnDefinition.SharedSizeGroup>Who</ColumnDefinition.SharedSizeGroup>
                </ColumnDefinition>
                <ColumnDefinition>
                    <ColumnDefinition.Width>*</ColumnDefinition.Width>
                </ColumnDefinition>
            </Grid.ColumnDefinitions>
            <DataGridCell BorderThickness="0" Content="{Binding Timestamp}" Grid.Column="0" Background="Black" Foreground="LightCyan"/>
            <DataGridCell BorderThickness="0" Content="{Binding Who}" Grid.Column="1" Background="Black" Foreground="LightBlue"/>
            <DataGridCell BorderThickness="0" Grid.Column="2" Background="Black" Foreground="White">
                <TextBox Text="{Binding What, Mode=OneWay}" IsReadOnly="True" TextWrapping="Wrap"/>
            </DataGridCell>
        </Grid>
    </DataTemplate>
</UserControl.Resources>

<ListBox ItemsSource="{Binding History}" SnapsToDevicePixels="True" Background="Magenta" Padding="0"/>

我认为大部分内容并不重要,只是为了完整性而包含它。有趣的是我看到滚动条外的洋红色背景,就像列表框内容一样,它的滚动条实际上​​是在列表框中填充的。它看起来像这样:

ListBox Padding

即使列表框的大小合理,我也会看到外洋红色,当你将它缩小时,它会更容易看到。

我已经尝试了每一个可以摆脱洋红色的元素的边距/填充,但我似乎无法做到。我不知道造成这种情况的原因,或者如何修复&#39;它。我可能会将我的例子简化为最基本的部分,但我认为我会先发布,因为它可能只是一个愚蠢明显的答案。如果是的话我很抱歉。

1 个答案:

答案 0 :(得分:0)

这是因为ListBox的边框填充的硬编码值为“1”。

<ControlTemplate TargetType="{x:Type ListBox}">
                <Border Name="Bd"
                        Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        SnapsToDevicePixels="true"
                        Padding="1">
                    <ScrollViewer Padding="{TemplateBinding Padding}"
                                  Focusable="false">
                        <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                    </ScrollViewer>
                </Border>
            </ControlTemplate>

所以你可以自己修改模板,或者像下面那样修改模板:

void OnListBoxLoaded(object sender, RoutedEventArgs e)
    {
        Border border = VisualTreeHelper.GetChild((ListBox)sender, 0) as Border;
        if(border != null)
        {
            border.Padding = new Thickness(0);
        }
    }

以上假设您使用的是默认的Windows aero主题。如果您更改了主题,或者确实如果aero主题发生了变化,它可能会中断。