2012-01-24 2 views
0

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

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

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()]); 
    } 

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

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

Вместо проверки тип источника, как это ...

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()]); 
    } 
} 
3

Вы пытаетесь бросить 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, прежде чем пытаться их использовать.