Как поместить несколько пользовательских элементов управления динамически в элемент данных о поведении мыши - PullRequest
1 голос
/ 30 марта 2011

У меня есть элемент данных для элемента списка, в котором у меня есть таблица с двумя столбцами, использующая WPF. В первом столбце я хочу динамически разместить несколько настраиваемых элементов управления (кнопок) с использованием C # в коде. Я не знаю, с чего начать, и с чего мне начать, кто-нибудь может помочь мне с некоторыми отличными материалами и примерами. Любой ответ будет очень признателен.

Заранее спасибо.

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>

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Вы указали, что хотите использовать код сзади, поэтому он будет выглядеть примерно так:

XAML:

<StackPanel Initialized="StackPanel_Initialized" .. />

Код сзади:

using MyNamespace;

private void StackPanel_Initialized(object sender, EventArgs e)
{
    MyControl newItem = new MyControl();
    // Set any other properties

    StackPanel parent = sender as StackPanel;
    parent.Children.Add(newItem);
}
1 голос
/ 25 апреля 2011

Если вы ищете добавление элементов управления в первом столбце вашей сетки, тогда поместите Panel в первый столбец и в коде добавьте элементы управления как дочерние элементы для этой панели. Итак, как вы упомянули выше, что вы используете 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);

и затем вызовите следующий метод:

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;
}
...