這是因爲在你的代碼中,你在一個新的UserControl2上引發了一個事件。 UserControl1.button1_Click事件應該是這樣的:
private void button1_Click(object sender, RoutedEventArgs e)
{
if (this.Parent != null && this.Parent is StackPanel)
{
StackPanel parentControl = this.Parent as StackPanel;
foreach (UIElement child in parentControl.Children)
{
if (child is UserControl2)
((UserControl2)child).CallDelegate();
}
}
}
編輯: 凱,所以它似乎你想獲得window1中的所有usercontrol2被調整大小。那麼你需要的是做一個遞歸函數來獲取最頂層的父,如(從hardcodet.net/2008/02/find-wpf-parent改裝成)
DependencyObject GetHighestParent(DependencyObject child)
{
ContentElement contentElement = child as ContentElement;
if (contentElement != null)
{
DependencyObject parent = ContentOperations.GetParent(contentElement);
if (parent != null) return parent;
FrameworkContentElement fce = contentElement as FrameworkContentElement;
return fce != null ? fce.Parent : null;
}
FrameworkElement frameworkElement = child as FrameworkElement;
if (frameworkElement != null)
{
DependencyObject parent = frameworkElement.Parent;
if (parent != null)
{
return GetHighestParent(parent);
}
else
{
return child;
}
}
DependencyObject visualParent = VisualTreeHelper.GetParent(child);
if (visualParent != null)
return GetHighestParent(visualParent);
else
return child;
}
,那麼你可能要創建一個方法walkdown所有的孩子是這樣的:
void CallDelegateInAllControl2(DependencyObject parent)
{
int childCount = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < childCount; i++)
{
DependencyObject child = VisualTreeHelper.GetChild(parent, i);
if (child is UserControl2)
{
((UserControl2)child).CallDelegate();
}
else
{
CallDelegateInAllControl2(child);
}
}
}
,然後你把它Button1_Click事件中
private void button1_Click(object sender, RoutedEventArgs e)
{
DependencyObject parent = GetHighestParent(this);
if(parent!=null)
CallDelegateInAllControl2(parent);
}
注:散步,好父母和孩子可能是棘手和危險的,我認爲,我相信這是一個長 所以你可能只想重新佈局你的window1,所以它有一個帶有usercontrol1元素和所有usercontrol2元素的StackPanel/Grid,所以你可以使用我發佈的第一個代碼。
請給出你想要做什麼的更多細節,你已經嘗試過,以及它是如何失敗的。 – 2010-10-21 05:49:17
我在下面的答案中添加了更多詳細信息。我渴望做到這一點。你可以告訴我如何 – 2010-10-21 06:00:16