Проблемы с пунктом меню и событиями кнопок - PullRequest
0 голосов
/ 25 января 2012

Я пытаюсь передать пользовательские элементы управления в виде страниц. У меня это работает с кнопками. Когда я добавил меню с событиями кликов, оно больше не работает.

Это блок кода, в котором выясняется, какой пользовательский элемент управления должен заполнить основной макет. Эта часть использует только кнопки и работает.

private void btnGeneral_Click(object sender, RoutedEventArgs e)
    {
        PanelMainContent.Children.Clear();
        Button button = (Button)e.OriginalSource;
        PanelMainWrapper.Header = button.Content;
        Type type = this.GetType();
        Assembly assembly = type.Assembly;
        PanelMainContent.Children.Add(_userControls[button.Tag.ToString()]);
    }

Эта часть пытается использовать элементы меню и кнопки, она не работает

public void btnGeneral_Click(object sender, RoutedEventArgs e)
    {   

        PanelMainContent.Children.Clear();
        MenuItem menuItem = (MenuItem)e.OriginalSource;
        Button button = (Button)e.OriginalSource;

        if (e.OriginalSource == menuItem)
        {
            PanelMainWrapper.Header = menuItem.Header;
            Type type = this.GetType();
            Assembly assembly = type.Assembly;
            PanelMainContent.Children.Add(_userControls[menuItem.Tag.ToString()]);
        }

        if (e.OriginalSource == button)
        {
            PanelMainWrapper.Header = button.Content;
            Type type = this.GetType();
            Assembly assembly = type.Assembly;
            PanelMainContent.Children.Add(_userControls[button.Tag.ToString()]);
        }
    }

Ошибки, которые я получаю.

XamlParseException:
The invocation of the constructor on type 'Test.MainWindow' that matches the specified    binding constraints threw an exception.' Line number '5' and line position '9'

InnerException
{"Unable to cast object of type 'System.Windows.Controls.Button' to type 'System.Windows.Controls.MenuItem'."}

Любое руководство будет с благодарностью.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 25 января 2012

Вы пытаетесь разыграть Button как MenuItem здесь:

MenuItem menuItem = (MenuItem)e.OriginalSource;
Button button = (Button)e.OriginalSource;

Я забыл точный термин для него, но вместо этого произнесу его следующим образом:

MenuItem menuItem = e.OriginalSource as MenuItem;
Button button = e.OriginalSource as Button;

Этот метод вернет null, если приводимый объект не относится к ожидаемому типу, и не вызовет исключение.Просто убедитесь, что вы проверяете, что ваши menuItem и button переменные не null, прежде чем пытаться их использовать.

2 голосов
/ 25 января 2012

Вместо этого проверяйте тип источника следующим образом ...

if (e.OriginalSource == menuItem)

... вместо этого вы можете проверить это так:

if(e.OriginalSource is MenuItem)

Затем вы можете перемещать объявления переменных внутри ваших блоков if. Итак, ваш окончательный код выглядит так:

public void btnGeneral_Click(object sender, RoutedEventArgs e)
{   
    PanelMainContent.Children.Clear();

    if (e.OriginalSource is MenuItem)
    {
        MenuItem menuItem = (MenuItem)e.OriginalSource;
        PanelMainWrapper.Header = menuItem.Header;
        Type type = this.GetType();
        Assembly assembly = type.Assembly;
        PanelMainContent.Children.Add(_userControls[menuItem.Tag.ToString()]);
    }

    if (e.OriginalSource is Button)
    {
        Button button = (Button)e.OriginalSource;
        PanelMainWrapper.Header = button.Content;
        Type type = this.GetType();
        Assembly assembly = type.Assembly;
        PanelMainContent.Children.Add(_userControls[button.Tag.ToString()]);
    }
}
...