在UWP中继承父级的前景值,就像TextBlock一样

时间:2017-05-19 13:08:07

标签: c# xaml uwp uwp-xaml

当我在ListViewItem style中设置SelectedForeground时,DataTemplate项内的TextBlock会根据需要更改选择的颜色。我希望将相同的颜色应用于DataTemplate中的其他元素,例如Path或Rectangle:

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid>
            <TextBlock Text="Hello" />
            <Path Fill={?} />
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

我尝试创建自定义控件并应用模板:

<ControlTemplate x:Key="myControlTemplate" TargetType="local:myControl">
    <Grid>
        <TextBlock Text="Hello" />
        <Path Fill="{Binding Foreground, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" />
    </Grid>
</ControlTemplate>

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid>
            <controls:myControl Template="{StaticResource myControlTemplate}"/>            
        </Grid>
    </DataTemplate>
</ListView.ItemTemplate>

在这种情况下,路径会继承ListViewItemPresenter中的值,但只返回一次 - 当选择更改时,它不会更新值。

如何强制Path.Fill属性像TextBlock一样更新它的颜色?

2 个答案:

答案 0 :(得分:1)

您可以直接在listView的项目模板中使用relativeSource。

        <ListView.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Rectangle Width="24"
                               Height="24"
                               Fill="{Binding Foreground, RelativeSource={RelativeSource TemplatedParent}}"/>
                    <TextBlock Text="{Binding}"
                               x:Name="TitleBlock"/>
                </StackPanel>
            </DataTemplate>
        </ListView.ItemTemplate>

答案 1 :(得分:0)

ControlTemplate内,&#34;模板化的父母&#34;是控件本身,因此在混合中添加自定义控件并不能帮助您。

你可能想要的是这个。我无法在UWP中测试它,所以如果您有任何错误,请告诉我。

<ListView.ItemTemplate>
    <DataTemplate>
        <Grid>
            <TextBlock Text="Hello" />
            <Path 
                x:Name="MyPath"
                Fill="YellowGreen"
                Data="M 0,0 L 16,0 L 16,16 L 0,16 Z"
                />
        </Grid>
        <DataTemplate.Triggers>
            <DataTrigger 
                Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListViewItem}}" 
                Value="True">
                <Setter 
                    TargetName="MyPath"
                    Property="Fill"
                    Value="{Binding SelectedForeground, RelativeSource={RelativeSource AncestorType=ListView}}" 
                    />
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</ListView.ItemTemplate>