如何在代码中获取ListBox ItemsPanel

我有一个带有ItemsPanel的ListBox

       

我想使用后面的代码中的TranslateTransform沿X轴移动堆栈面板。

问题是,我找不到Stack Panel。

 ThumbListBox.FindName("ThumbListStack") 

什么都不返回 我想用它:

 Storyboard.SetTarget(x, ThumbListBox.FindName("ThumbListStack")) 

如何获取堆栈面板,以便我可以将其与TranslateTransform一起使用

谢谢

您可以对StackPanel中的ItemsPanelTemplate使用Loaded事件

       

然后在代码背后

 private StackPanel m_itemsPanelStackPanel; private void StackPanel_Loaded(object sender, RoutedEventArgs e) { m_itemsPanelStackPanel = sender as StackPanel; } 

另一种方法是遍历Visual Tree并找到StackPanel ,它将是ItemsPresenter的第一个子ItemsPresenter

 public void SomeMethod() { ItemsPresenter itemsPresenter = GetVisualChild(listBox); StackPanel itemsPanelStackPanel = GetVisualChild(itemsPresenter); } private static T GetVisualChild(DependencyObject parent) where T : Visual { T child = default(T); int numVisuals = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < numVisuals; i++) { Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); child = v as T; if (child == null) { child = GetVisualChild(v); } if (child != null) { break; } } return child; } 

抱歉,我刚注意到我忘了保存编辑…我发现你已经接受了答案,但这对我来说似乎更像是一个黑客。 这是我对FindChild的实现,您可能希望将来使用它,或者如果您经常这样做。

 public static T FindChild(this FrameworkElement obj, string name) { DependencyObject dep = obj as DependencyObject; T ret = default(T); if (dep != null) { int childcount = VisualTreeHelper.GetChildrenCount(dep); for (int i = 0; i < childcount; i++) { DependencyObject childDep = VisualTreeHelper.GetChild(dep, i); FrameworkElement child = childDep as FrameworkElement; if (child.GetType() == typeof(T) && child.Name == name) { ret = (T)Convert.ChangeType(child, typeof(T)); break; } ret = child.FindChild(name); if (ret != null) break; } } return ret; } 

它会检查所有孩子和孩子的孩子,比较控件上设置的类型和名称。 像这样用它:

 StackPanel ipanel = ThumbListBox.FindChild("ThumbListStack"); if(ipanel == null) MessageBox.Show("couldn't find anything"); else MessageBox.Show("Aha! Found: " ipanel.Name); 

尝试以下扩展方法:

 var childStackPanels = FindVisualChildren(ThumbListBox); 

方法本身:

 public static IEnumerable FindVisualChildren(this DependencyObject depObj) where T : DependencyObject { if (depObj != null) { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) { DependencyObject child = VisualTreeHelper.GetChild(depObj, i); var typedChild = child as T; if (typedChild != null) { yield return typedChild; } foreach (T childOfChild in FindVisualChildren(child)) { yield return childOfChild; } } } } 

PS:您可以自己扩展它以检查特定的控件名称,因此方法将返回单个控件而不是列表。