WPF ListBox无法设置背景颜色

时间:2013-11-07 07:55:20

标签: c# .net wpf

我有一个问题,我无法设置ListBox-Control的背景颜色。我创建了一个ItemsControl模板和DataTemplates:

 <Style TargetType="ItemsControl" x:Key="LogViewerStyle">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate>
        <Grid>
          <ScrollViewer CanContentScroll="True">
            <ItemsPresenter SnapsToDevicePixels="True" />
          </ScrollViewer>
        </Grid>
      </ControlTemplate>
    </Setter.Value>      
  </Setter>   

 <DataTemplate DataType="{x:Type local:LogEntry}">
  <Grid IsSharedSizeScope="True">
    <Grid.ColumnDefinitions>
      <ColumnDefinition SharedSizeGroup="Index" Width="Auto"/>
      <ColumnDefinition SharedSizeGroup="Date" Width="Auto"/>
      <ColumnDefinition/>
    </Grid.ColumnDefinitions>

    <TextBlock Text="{Binding Index}" Grid.Column="0" FontWeight="Normal" Margin="2,0,2,0" Foreground="{Binding Path=LineNumbersColor, ElementName=LogViewerProperty}" Cursor="RightArrow.cur" TextAlignment="Right" />
    <TextBlock Text="{Binding DateTime}" Grid.Column="1" FontWeight="Bold" Margin="0,0,5,0" />
    <TextBlock Text="{Binding Message}" Grid.Column="2" TextWrapping="{Binding Path=WordWrapping, ElementName=LogViewerProperty, Converter={StaticResource BoolToTextWrap}}" />

  </Grid>
</DataTemplate>

当我尝试给我的ListBox一个BackgroundColor时,没有任何事情发生:

<ListBox ItemsSource="{Binding}" x:Name="LogViewer" Background="Cornsilk" Style="{StaticResource LogViewerStyle}">
  <ItemsControl.Template>
    <ControlTemplate>
      <ScrollViewer CanContentScroll="True" Padding="{TemplateBinding Padding}" HorizontalScrollBarVisibility="{Binding Path=WordWrapping, ElementName=LogViewerProperty, Converter={StaticResource BoolToScrollbarVisibility}}" VerticalScrollBarVisibility="{Binding Path=VerticalScrollbarVisible, ElementName=LogViewerProperty}">
        <ItemsPresenter/>
      </ScrollViewer>
    </ControlTemplate>
  </ItemsControl.Template>
  <ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
      <VirtualizingStackPanel IsItemsHost="True">
      </VirtualizingStackPanel>
    </ItemsPanelTemplate>
  </ItemsControl.ItemsPanel>
</ListBox>

此刻我不知道为什么。任何人都可以给我一个提示吗?谢谢!

2 个答案:

答案 0 :(得分:2)

使用键LogViewerStyle将样式应用于ListBox,后者还定义了一个模板,然后隐式为ListBox创建另一个模板。

为什么呢?那不是wpf通常的面包。它没有出现,是吗?

请删除其中一个。

虽然要回答你的问题,你必须告诉你的ScrollViewer听一下ListBox的背景。

看看这个:

<Style TargetType="ListBox" x:Key="MyListBox">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate>
        <Grid Background="{TemplateBinding Background}">
          <ScrollViewer CanContentScroll="True">
            <ItemsPresenter SnapsToDevicePixels="True" />
          </ScrollViewer>
        </Grid>
      </ControlTemplate>
    </Setter.Value>      
  </Setter> 

然后只需在ListBox上设置样式。

<ListBox Style="{StaticResource MyListBox}" /> 

看看它如何告诉Grid使其背景与ListBox相同。

答案 1 :(得分:0)

设置背景=“{TemplateBinding Background}”为我应用背景

<ListBox ItemsSource="{Binding}" Width="100" x:Name="LogViewer" Background="Red" Style="{StaticResource LogViewerStyle}">
                    <ItemsControl.Template>
                        <ControlTemplate>
                            <ScrollViewer CanContentScroll="True" Padding="{TemplateBinding Padding}" Background="{TemplateBinding Background}" HorizontalScrollBarVisibility="{Binding Path=WordWrapping, ElementName=LogViewerProperty, Converter={StaticResource BoolToScrollbarVisibility}}" VerticalScrollBarVisibility="{Binding Path=VerticalScrollbarVisible, ElementName=LogViewerProperty}">
                                <ItemsPresenter/>
                            </ScrollViewer>
                        </ControlTemplate>
                    </ItemsControl.Template>
                    <ItemsControl.ItemsPanel>
                        <ItemsPanelTemplate>
                            <VirtualizingStackPanel IsItemsHost="True">
                            </VirtualizingStackPanel>
                        </ItemsPanelTemplate>
                    </ItemsControl.ItemsPanel>
                </ListBox>