我有MainWindow和2个用户控件。在主窗口中有Tab Control,如果单击MainWindow中的按钮搜索,它将加载用户控件。我可以通过此代码在主窗口中添加标签项。
private void search(object sender, RoutedEventArgs e)
{
tc.Visibility = Visibility.Visible; // It is hidden by default
TabItem tab = new TabItem();
tab.Header = "Поиск";
UCSearch c = new UCSearch(); // User Control 1
tab.Content = c;
tc.Items.Add(tab);
}
在Tab项中加载用户控件1时。用户控件中有Tetxbox和Button 1.我想在点击Button时加载User Control 2。但我无法访问用户控件1在主窗口中的Tab Control。请给我指示。在哪里挖?
答案 0 :(得分:1)
您可以使用Extension方法在VisualTree中搜索 TabControl 类型的Parent。
e.g。
扩展方法:
public static class VisualTreeExtensions
{
public static T FindParent<T>(this DependencyObject child)
where T : DependencyObject
{
//get parent item
DependencyObject parentObject = VisualTreeHelper.GetParent(child);
//we've reached the end of the tree
if (parentObject == null) return null;
//check if the parent matches the type we're looking for
var parent = parentObject as T;
if (parent != null)
{
return parent;
}
else
{
return FindParent<T>(parentObject);
}
}
在您的按钮处理程序中
private void Button_Click(object sender, RoutedEventArgs e)
{
var tabControl = (sender as Button).FindParent<TabControl>();
tabControl.Items.Add(new TabItem() { Header = "New"});
}
更好,更灵活(但也更复杂)的解决方案是通知参与者(这里:你的按钮触发某种消息,它被点击,其他人(你的TabControl)听取并做出反应(创建一个新的)标签)。 例如,可以使用Mediator模式或EventAggregator来完成。