0

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

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

我尝试了 .FindByName(Textblock) 和 visualtreehelper。还尝试在代码 txtVeranderkleur 中输入它,但系统不知道该控件,因为我猜它在 childs 内部。没有为我工作。

我需要找到“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>
4

1 回答 1

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;
于 2013-05-07T14:09:29.390 回答