ItemControl背景颜色

时间:2016-12-03 09:37:38

标签: xaml background uwp itemscontrol

在一个全新的通用Windows平台应用程序中,我正在尝试设置ItemsControl的背景。但它似乎没有做任何事情。我对VS模板所做的唯一更改是在MainPage.xaml中,现在看起来像这样:

<Page
    x:Class="UWPPlayground.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:UWPPlayground"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" x:Name="Hello">
  <Grid Background="Blue">
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="*">

      </ColumnDefinition>
      <ColumnDefinition Width="*">

      </ColumnDefinition>
    </Grid.ColumnDefinitions>
    <ItemsControl Grid.Row="0" Grid.Column="0" Width="60" Height="30" Foreground="Wheat" Background="White">
      <TextBlock Text="Hello World!"></TextBlock>
      <TextBlock Text="Can you see this?"></TextBlock>
    </ItemsControl>
    <Grid Grid.Row="0" Grid.Column="1" Background="Purple"></Grid>
    </Grid>
</Page>

结果如下所示。 ItemsControl的Foreground属性似乎工作得很好,因为TextBlocks有小麦色的文本。由于控件的小尺寸,文本被切断,如预期的那样。然而,背景是不可见的。我错过了什么?

enter image description here

1 个答案:

答案 0 :(得分:1)

ItemsControl继承自Control,它在基类级别定义了许多视觉属性,这些属性不一定直接影响控件的外观。这些属性通常通过ControlTemplate中的TemplateBindings引用,然后产生所需的外观。模板是否使用这些属性确定它们是否有任何用途。

您会注意到更改UserControl的背景也没有任何效果(出于上述相同的原因)。

网格,矩形,边框(等)等非控件类开箱即用,这些属性通常用于控件模板中以产生特定外观的元素。

ItemsControl派生类(如ListView)确实支持background属性的原因是因为其模板中的某个根级元素引用了Background属性(通过TemplateBinding)。 ItemsControl本身没有模板。

我认为Foreground属性工作的原因是因为它将从父级继承其值。 (某些依赖项属性可以像这样继承它们的值。)

为ItemsControl设置背景的最简单方法是将其包装在Border(或Grid,they're essentially the same now)中,然后在 上设置背景画笔。

我不建议您为您的示例执行以下操作,但如果您希望Background属性起作用,则需要执行以下操作:

<ItemsControl Background="Red">
    <ItemsControl.Template>
        <ControlTemplate TargetType="ItemsControl">
            <Grid Background="{TemplateBinding Background}">
                <ItemsPresenter/>
            </Grid>
        </ControlTemplate>
    </ItemsControl.Template>
</ItemsControl>