Это потому, что в вашем коде вы поднимаете событие на новом 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();
}
}
}
EDIT: kay, поэтому, похоже, вы хотите, чтобы все usercontrol2 в окне1 изменилось. то, что вам нужно сделать рекурсивную функцию, чтобы получить наивысочайший родитель, например, (мод от 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);
}
примечания: прогулка, чтобы получить родитель и ребенок может быть сложным и рискованным я думаю, и я считаю, что это длинный так что вы можете просто переустановить окно1, поэтому у него есть StackPanel/Grid с элементом usercontrol1 и всеми элементами usercontrol2 внутри него, чтобы вы могли использовать первый код i post.
Пожалуйста, сообщите более подробную информацию о том, что вы пытаетесь сделать, и вы попытались, и как это произошло. –
Я добавил более подробную информацию в ваш ответ ниже. Я умираю, чтобы сделать это. можешь ли ты мне позвонить, как –