2014-09-27 3 views
0

У меня возникли некоторые проблемы с обучением WPF, я создал пользовательский UserControl так:Как мне избавиться от этого списка WPF/XAML ListBox?

<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

Я вижу внешние пурпурное, даже если ListBox разумного размера, это просто легче увидеть при уменьшении его маленьким, как это.

Я пробовал каждый край/отступы на каждом элементе, который я могу, чтобы избавиться от пурпурного, но я не могу показаться. Я не знаю, что вызывает это, или как его «исправить». Я, вероятно, упрощу свой пример до самых основных частей, но подумал, что сначала опубликую, потому что, возможно, это просто тупой очевидный ответ. Приношу свои извинения, если так.

ответ

0

Это потому, что ListBox имеет жестко закодированное значение '1' для Border Padding.

<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); 
     } 
    } 

выше делает предположение, что вы используете окна по умолчанию Aero тема. Если вы меняете тему, или действительно, если тема aero изменена, она может сломаться.

Смежные вопросы