在一个全新的通用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有小麦色的文本。由于控件的小尺寸,文本被切断,如预期的那样。然而,背景是不可见的。我错过了什么?
答案 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>