Пользовательские элементы управления WPF - PullRequest
1 голос
/ 14 июня 2011

Я новичок в WPF, моя проблема в том, что у меня есть главное меню, как UserControl, добавленное в главное окно, и главное окно разделено на три столбца: в самом правом столбце у меня есть DockPanel, теперьмоя проблема в том, что я не знаю, как добавить другой элемент управления в этот правый столбец, когда нажимаю на элемент верхнего меню.

Некоторый код, иллюстрирующий мою попытку:

public partial class TopMenu : UserControl
{
    private void menuItem_Click(object sender, RoutedEventArgs e)
    {
        SecondControl ctrl = new SecondControl();
        Window1 winMain = new Window1();

        winMain.dp3.Children.Add(ctrl ); // dp3 is the dock panel in the right column of
    }
}

Теперь, что я должен сделать, чтобы отобразить этот элемент управления на window1?

Ответы [ 2 ]

0 голосов
/ 14 июня 2011

Поскольку вы новичок в WPF, я рекомендую потратить некоторое время на изучение MVVM, связывания, интерфейса INotifyPropertyChanged и т. Д.

Хорошие ресурсы:

Вы можете решить свою проблему несколькими способами.Например, вы можете поместить ContentControl в правый столбец, где вы хотите показать свой SecondControl.Теперь, когда вы хотите показать свой SecondControl, просто заполните свойство Content ContentControl с помощью SecondControl

0 голосов
/ 14 июня 2011

Проблема в том, что вы добавляете элемент управления к DockPanel нового экземпляра окна Window1.Вам нужно будет «найти» экземпляр типа Window1, в который встроен ваш элемент управления TopMenu.

Используя здесь код , мы можем найти верхний уровеньcontrol, ваше окно, а затем добавьте элементы управления к этому экземпляру:

private void menuItem_Click(object sender, RoutedEventArgs e)
{
    var topLevelControl = GetTopLevelControl(this);
    if (topLevelControl != null && topLevelControl is Window1)
    {
        var currentWindow = topLevelControl as Window1;
        SecondControl ctrl = new SecondControl();   
        currentWindow.dp3.Children.Add(ctrl ); 
    }
}

DependencyObject GetTopLevelControl(DependencyObject control)  
{
    DependencyObject tmp = control;
    DependencyObject parent = null;
    while((tmp = VisualTreeHelper.GetParent(tmp)) != null)
    {
        parent = tmp;
    }
    return parent;
}
...