C# 如何在鼠标行为的datatemplete中动态放置一些自定义控件

C# 如何在鼠标行为的datatemplete中动态放置一些自定义控件,c#,wpf,wpf-controls,listbox,datatemplate,C#,Wpf,Wpf Controls,Listbox,Datatemplate,我有一个列表框项的Datatemplete,其中有一个使用WPF的两列网格。在第一列中,我想使用C#In代码隐藏动态地放置一些定制控件(按钮)。我不知道如何开始,我应该从哪里开始,谁能帮我一些伟大的投入和例子。任何答复都将不胜感激 提前谢谢 XAML代码: <ListBox x:Name="ListBoxItem" Grid.Row="1" SelectionMode="Extended"

我有一个列表框项的Datatemplete,其中有一个使用WPF的两列网格。在第一列中,我想使用C#In代码隐藏动态地放置一些定制控件(按钮)。我不知道如何开始,我应该从哪里开始,谁能帮我一些伟大的投入和例子。任何答复都将不胜感激

提前谢谢

XAML代码:

<ListBox x:Name="ListBoxItem"
                     Grid.Row="1"
                     SelectionMode="Extended"
                     ScrollViewer.HorizontalScrollBarVisibility="Hidden"
                     VirtualizingStackPanel.IsVirtualizing="True" 
                     VirtualizingStackPanel.VirtualizationMode="Recycling"
                     FocusVisualStyle="{x:Null}"
                     KeyboardNavigation.IsTabStop="False"
                     Background="DarkGray"
                     ItemsSource="{Binding}">

                <ListBox.ItemsPanel>

                    <ItemsPanelTemplate>

                        <WrapPanel x:Name="ListContent"
                                   IsItemsHost="True"
                                   Width="500"/>

                    </ItemsPanelTemplate>

            </ListBox.ItemsPanel>

            <ListBox.ItemTemplate>

                <DataTemplate>

                        <DockPanel LastChildFill="True"
                                   HorizontalAlignment="Center"
                                   VerticalAlignment="Center">

                            <StackPanel DockPanel.Dock="Left"
                                        Width="30"
                                        Height="{Binding Height}">
                               <--Here I want to put few customize buttons in code behind-->
                            </StackPanel>

                            <Image x:Name="MainPage" 
                                   Stretch="UniformToFill"
                                   Source="{Binding ImagePath}"
                                   Height="{Binding Height}"
                                   Width="{Binding Width}"/>

                        </DockPanel>

                </DataTemplate>

            </ListBox.ItemTemplate>


您指定要使用代码隐藏,因此它看起来像这样:

XAML:


如果要在网格的第一列中添加控件,请在第一列中放置一个面板,并在后面的代码中将控件作为子控件添加到该面板。正如您在上面提到的,您正在使用DataTemplete,那么我想说的是,您可以访问该面板,例如:

将以下代码放入事件中,您需要在其中添加控件

ListBoxItem item = (ListBoxItem)(this.lst.ItemContainerGenerator.ContainerFromIndex(i));
ContentPresenter presenter = FindVisualChild<ContentPresenter>(item);
DataTemplate template = presenter.ContentTemplate;
StackPanel stack = (StackPanel)template.FindName("FirstColumn Panel Name", presenter);
ListBoxItem项=(ListBoxItem)(this.lst.ItemContainerGenerator.ContainerFromIndex(i));
ContentPresenter presenter=FindVisualChild(项目);
DataTemplate=presenter.ContentTemplate;
StackPanel stack=(StackPanel)template.FindName(“FirstColumn Panel Name”,presenter);
然后调用以下方法:

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;
}
private childItem FindVisualChild(DependencyObject obj)
where-childItem:DependencyObject
{
for(int i=0;i
嗨,瑞秋,非常感谢你的回答。如果您不介意的话,请分享一篇文章,告诉我StackPanel的初始化事件是如何工作的。@SharpUrBrain这里有一个链接:。我使用Initialized而不是Loaded,因为Initialized只运行一次(在初始化期间),而Loaded可以运行多次,但如果需要,您可以切换到Loaded。例如,切换时,TabControl运行加载/卸载tabs@Rachel:如果我说,我想在选定的ListBoxItem上的MouseHover time和从选定的ListBoxItem上的MouseAve上添加控件,那么您建议我做什么?@SharpUrBrain您可以使用
MouseEnter
MouseAve
事件,虽然我个人可能会构建一个
ContentControl
,带有一个触发器,该触发器基于
IsMouseOver
属性切换
模板
,但从那时起,您就不会经常重新创建items@Rachel当前位置实际上,我无法向您清楚地说明我的问题,而且我也无法在计算机上解决此问题mouseHover或MouseEnter,如果您不介意的话,您可以分享一下您的应用程序的示例代码吗?我想我可能会从中得到一些帮助。谢谢你的回答,但我已经用这种方式解决了这个问题。
ListBoxItem item = (ListBoxItem)(this.lst.ItemContainerGenerator.ContainerFromIndex(i));
ContentPresenter presenter = FindVisualChild<ContentPresenter>(item);
DataTemplate template = presenter.ContentTemplate;
StackPanel stack = (StackPanel)template.FindName("FirstColumn Panel Name", presenter);
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;
}