发现里面Listbox.ItemTemplate控制(WPF C#) [英] Find control inside Listbox.ItemTemplate (WPF C#)

查看:468
本文介绍了发现里面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的Horizo​​ntalAlignment =中心>
<图像来源={结合缩略图,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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆