我在学习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"/>
我认为大部分内容并不重要,只是为了完整性而包含它。有趣的是我看到滚动条外的洋红色背景,就像列表框内容一样,它的滚动条实际上是在列表框中填充的。它看起来像这样:
即使列表框的大小合理,我也会看到外洋红色,当你将它缩小时,它会更容易看到。
我已经尝试了每一个可以摆脱洋红色的元素的边距/填充,但我似乎无法做到。我不知道造成这种情况的原因,或者如何修复&#39;它。我可能会将我的例子简化为最基本的部分,但我认为我会先发布,因为它可能只是一个愚蠢明显的答案。如果是的话我很抱歉。
答案 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主题发生了变化,它可能会中断。