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