发现里面Listbox.ItemTemplate控制(WPF C#) [英] Find control inside Listbox.ItemTemplate (WPF C#)
本文介绍了发现里面Listbox.ItemTemplate控制(WPF C#)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一些问题找到合适的内的TextBlock
控制的StackPanel
。
我的标记:
<列表框名称=lstTimelineItemContainerStyle ={StaticResource的TwItemStyle}
MouseDoubleClick =lstTimeline_MouseDoubleClick>
< ListBox.ItemTemplate>
<&DataTemplate的GT;
< DockPanel中了maxWidth ={绑定的ElementName = lstTimeline,路径= ActualWidth的}>
< BORDER保证金=10DockPanel.Dock =左BorderBrush =白
了borderThickness =1HEIGHT =48WIDTH =48的HorizontalAlignment =中心>
<图像来源={结合缩略图,IsAsync = TRUE}HEIGHT =48WIDTH =48/>
< /边框>
< StackPanel的名称=stkPanel保证金=10DockPanel.Dock =右>
< TextBlock的文本={绑定用户名}粗细=大胆字号=18/>
< TextBlock的文本={结合文字}保证金=0,4,0,0字号=14
前景=#c6de96TextWrapping =WrapWithOverflow/>
< TextBlock的文本={结合ApproximateTime}字号=14
的FontFamily =格鲁吉亚fontstyle的=斜体前景=#BBB/>
< TextBlock的文本={结合ScreenName链接}NAME =lblScreenName字号=14
的FontFamily =格鲁吉亚fontstyle的=斜体前景=#BBB
加载=lblScreenName_Loaded/>
< / StackPanel的>
< / DockPanel中>
< / DataTemplate中>
< /ListBox.ItemTemplate>
< /列表框>
我双击代码:
私人无效lstTimeline_MouseDoubleClick(对象发件人,MouseButtonEventArgs E)
{
ListBoxItem的LBI =(lstTimeline.SelectedItem为ListBoxItem的);
的StackPanel项目= lbi.FindName(stkPanel)作为StackPanel的;
如果(项目!= NULL)
MessageBox.Show(StackPanel的空);
TextBlock中的textBox = item.FindName(lblScreenName)作为TextBlock的;
如果(textBox中!= NULL)
MessageBox.Show(TextBlock的空);
MessageBox.Show(textBox.Text);
}
但的StackPanel
为空。如何找到的SelectedItem
?
正确
的TextBlock
感谢您的帮助。
解决方案
ListBoxItem的myListBoxItem =(ListBoxItem中)(lstUniqueIds.ItemContainerGenerator。 ContainerFromIndex(lstUniqueIds.SelectedIndex));
ContentPresenter myContentPresenter = FindVisualChild< ContentPresenter>(myListBoxItem);
的DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
复选框目标=(复选框)myDataTemplate.FindName(chkUniqueId,myContentPresenter);
如果(target.IsChecked)
{
target.IsChecked = FALSE;
}
,否则
{
target.IsChecked = TRUE;
}
功能 FindVisualChild
CAN在MSDN的网页。 FrameworkTemplate.FindName方法为:
私人childItem FindVisualChild< childItem>(DependencyObject的OBJ)
式childItem:DependencyObject的
{
为( INT I = 0; I< VisualTreeHelper.GetChildrenCount(OBJ);我++)
{
DependencyObject的孩子= VisualTreeHelper.GetChild(OBJ,I);
如果(孩子= NULL&放大器;!&安培;孩子childItem)
回报(childItem)子女;
,否则
{
childItem childOfChild = FindVisualChild< childItem>(小孩);
如果(childOfChild!= NULL)
返回childOfChild;
}
}
返回NULL;
}
I have some problems finding the right TextBlock
control inside a StackPanel
.
My markup:
<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,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>
My double click code:
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);
}
But the StackPanel
is null. How do find the right TextBlock
in SelectedItem
?
Thanks for your help.
解决方案
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;
}
Function FindVisualChild
can be found on the MSDN page 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;
}
这篇关于发现里面Listbox.ItemTemplate控制(WPF C#)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文