我在StackPanel中找到正确的TextBlock控件时遇到了一些问题.
我的加价:
我的加价:
<ListBox Name="lstTimeline" ItemContainerStyle="{StaticResource TwItemStyle}" MouseDoubleClick="lstTimeline_MouseDoubleClick"> <ListBox.ItemTemplate> <DataTemplate> <DockPanel MaxWidth="{Binding ElementName=lstTimeline,Path=ActualWidth}"> <Border Margin="10" DockPanel.Dock="Left" BorderBrush="White" BorderThickness="1" Height="48" Width="48" HorizontalAlignment="Center"> <Image Source="{Binding ThumbNail,IsAsync=True}" Height="48" Width="48" /> </Border> <StackPanel Name="stkPanel" Margin="10" DockPanel.Dock="Right"> <TextBlock Text="{Binding UserName}" FontWeight="Bold" FontSize="18" /> <TextBlock Text="{Binding Text}" Margin="0,4,0" FontSize="14" Foreground="#c6de96" TextWrapping="WrapWithOverflow" /> <TextBlock Text="{Binding ApproximateTime}" FontSize="14" FontFamily="Georgia" FontStyle="Italic" Foreground="#BBB" /> <TextBlock Text="{Binding ScreenName}" Name="lblScreenName" FontSize="14" FontFamily="Georgia" FontStyle="Italic" Foreground="#BBB" Loaded="lblScreenName_Loaded" /> </StackPanel> </DockPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
我的双击代码:
private void lstTimeline_MouseDoubleClick(object sender,MouseButtonEventArgs e) { ListBoxItem lbi = (lstTimeline.SelectedItem as ListBoxItem); StackPanel item = lbi.FindName("stkPanel") as StackPanel; if (item != null) MessageBox.Show("StackPanel null"); TextBlock textBox = item.FindName("lblScreenName") as TextBlock; if (textBox != null) MessageBox.Show("TextBlock null"); MessageBox.Show(textBox.Text); }
但StackPanel为空.如何在SelectedItem中找到正确的TextBlock?
谢谢你的帮助.
解决方法
ListBoxItem myListBoxItem = (ListBoxItem)(lstUniqueIds.ItemContainerGenerator.ContainerFromIndex(lstUniqueIds.SelectedIndex)); ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem); DataTemplate myDataTemplate = myContentPresenter.ContentTemplate; CheckBox target = (CheckBox)myDataTemplate.FindName("chkUniqueId",myContentPresenter); if (target.IsChecked) { target.IsChecked = false; } else { target.IsChecked = true; }
函数FindVisualChild可以在MSDN页面FrameworkTemplate.FindName Method上找到:
private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) { DependencyObject child = VisualTreeHelper.GetChild(obj,i); if (child != null && child is childItem) return (childItem)child; else { childItem childOfChild = FindVisualChild<childItem>(child); if (childOfChild != null) return childOfChild; } } return null; }