none
WPF, ContextMenu RRS feed

  • Вопрос

  •  

    создал в Ресурсах ContextMenu.

    динамически создается несколько TextBlock и  к нему подключается ресурс ContextMenu.

     

     

    TextBlock tb = new TextBlock(); <br/>tb.Name =  "уникальное имя";<br/>tb.ContextMenu=this.Resources["mycontextmenu"];
    mystackpanel.Children.Add(tb);
    


    в методе обработке контекстного меню пытаюсь получить имя TextBlock'a (sender as ContextMenu).Parent.Name - выдает ошибку "обращение к нулевому объекту" .

    Как определить от какого именно TextBlock'a было вызвано контекстное  меню?

     

    8 сентября 2011 г. 8:05

Ответы

  • Обращение к нулевому объекту происходит потому, что не удается привести sender к типу ContextMenu, в этом случае возвращается null - так работает оператор as.

    Вы отслеживаете клик по MenuItem? Тогда делайте так:

     

            private void MenuItem_Click(object sender, RoutedEventArgs e)
            {
                var menuItem = sender as MenuItem;
                if (menuItem != null)
                {
                    var contextMenu = menuItem.Parent as ContextMenu;
                    if (contextMenu != null)
                    {
                        var textBlock = contextMenu.PlacementTarget as TextBlock;
                        if (textBlock != null)
                        {
                            MessageBox.Show(textBlock.Name);
                        }
                    }
                }
            }
    

    И еще можете посмотреть тему на stackoverflow - WPF Get the referenced item from a ContextMenu on a ListViewItem


    Для связи [mail]
    • Помечено в качестве ответа Learx 8 сентября 2011 г. 12:53
    8 сентября 2011 г. 9:43

Все ответы

  • Обращение к нулевому объекту происходит потому, что не удается привести sender к типу ContextMenu, в этом случае возвращается null - так работает оператор as.

    Вы отслеживаете клик по MenuItem? Тогда делайте так:

     

            private void MenuItem_Click(object sender, RoutedEventArgs e)
            {
                var menuItem = sender as MenuItem;
                if (menuItem != null)
                {
                    var contextMenu = menuItem.Parent as ContextMenu;
                    if (contextMenu != null)
                    {
                        var textBlock = contextMenu.PlacementTarget as TextBlock;
                        if (textBlock != null)
                        {
                            MessageBox.Show(textBlock.Name);
                        }
                    }
                }
            }
    

    И еще можете посмотреть тему на stackoverflow - WPF Get the referenced item from a ContextMenu on a ListViewItem


    Для связи [mail]
    • Помечено в качестве ответа Learx 8 сентября 2011 г. 12:53
    8 сентября 2011 г. 9:43
  • Спастибо, не знал поля Placementtarget, которое решило проблему.
    8 сентября 2011 г. 12:55