在代码中查找文本块以操纵颜色

时间:2013-05-07 13:53:44

标签: c# windows-phone-7

我需要在xaml中找到一个特定的控件来操作代码来改变背景。

我的问题是,找不到具体的控件。

我尝试了.FindByName(Textblock)和visualtreehelper。还尝试在代码txtVeranderkleur中键入它,但系统不知道控件,因为它在我想的孩子里面。一切都不适合我。

我需要找到“txtVeranderkleur”。所以我可以改变代码中的颜色。

<Grid x:Name="LayoutRoot" Background="White">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="80"/>
        </Grid.RowDefinitions>
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="0,0,0,28" Orientation="Horizontal">
            <Border Background="#EE2E24" CornerRadius="15,15,15,15" Width="450" Margin="15,15,15,15">
                <TextBlock x:Name="Events" TextWrapping="Wrap" Text="Evenementen" Style="{StaticResource subtitle}" Margin="15,15,15,15"/>
            </Border>
        </StackPanel>
        <ListBox Grid.Row="1"  Margin="12,-15,0,12" x:Name="lbDagprogrammaInfo" SelectionChanged="lbDagprogrammaInfo_SelectionChanged" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                    <StackPanel Orientation="Horizontal" Margin="15,0,0,17">
                        <Border Width="70" Height="70" BorderBrush="#EE2E24" Background="#EE2E24" BorderThickness="3" CornerRadius="3,3,3,3" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="0,5,0,0">
                            <TextBlock Width="70" Height="70" Text="{Binding LineTeller}" Style="{StaticResource contentRect}"></TextBlock>
                        </Border>
                        <StackPanel Orientation="Horizontal" Margin="8,0,0,0">
                            **<TextBlock x:Name="txtVeranderkleur" Style="{StaticResource contentText}">
                                <Run Text="{Binding LineUur}"></Run>
                                <Run Text="{Binding LineNaam}"></Run>
                            </TextBlock>**

                        </StackPanel>
                    </StackPanel>
                </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
        <StackPanel Width="480" Height="80" Background="Black" Grid.Row="2">
            <Image x:Name="imgSponsor"  Source="{Binding LineSponsorFoto}"  Height="80" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="3"  />
        </StackPanel>
    </Grid>

1 个答案:

答案 0 :(得分:2)

FindName不适用于DataTemplate内部的元素。

如果必须,可以使用lbDagprogrammaInfo.ItemContainerGenerator.ContainerFromIndex获取包含要修改的txtVeranderkleur的ListBoxItem,并使用VisualTreeHelper.GetChild向下搜索TextBlock的可视化树。

如果您可以根据每个项目的DataContext中的数据逻辑确定颜色,则可以将Background绑定到相应的Property,并使用IValueConverter选择颜色。

如果您只想根据ListBox功能(例如选择)更改颜色,您还应该考虑使用Visual States来更改颜色。

编辑:

这里是VisualTreeHelper路径的样子片段,尽管您应该找到更通用的方法。

ListBoxItem l = lbDagprogrammaInfo.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
Border b = VisualTreeHelper.GetChild(l, 0) as Border;
ContentControl c = VisualTreeHelper.GetChild(b, 0) as ContentControl;
ContentPresenter p = VisualTreeHelper.GetChild(c, 0) as ContentPresenter;
StackPanel s = VisualTreeHelper.GetChild(p, 0) as StackPanel;
TextBlock t = s.FindName("txtVeranderkleur") as TextBlock;