如何在wpf中从用户Control向现有选项卡控件添加选项卡项

时间:2012-01-25 08:34:46

标签: wpf

我有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。请给我指示。在哪里挖?

1 个答案:

答案 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来完成。