2009-07-09 2 views
0

Когда я добавляю команду ApplicationCommands в MenuItem в меню моего файла, независимо от того, через XAML или через код, когда я открываю меню, приложение выходит из строя в переполнении стека, причем абсолютно нет подробности о проблеме. Когда я удаляю команду, проблема также исчезает. Неважно, какой ApplicationCommand я использую.Переполнение стека при открытии меню с помощью ApplicationCommands в C#

часть стека вызовов:

  • WindowsBase.dll MS.Utility.ArrayItemList.ArrayItemList (ИНТ размер) + 0x20 байт
  • WindowsBase.dll MS.Utility.FrugalStructList.Capacity!. набор (INT значения) + 0x6a байты
  • WindowsBase.dll! MS.Utility.FrugalStructList.FrugalStructList (ИНТ размера) + 0x9 байт
  • PresentationCore.dll! System.Windows.EventRoute.EventRoute (System.Windows. Ro utedEvent RoutedEvent) + 0x35 байт
  • PresentationCore.dll! System.Windows.EventRouteFactory.FetchObject (System.Windows.RoutedEvent RoutedEvent) + 0x31 байт
  • PresentationCore.dll! System.Windows.UIElement.RaiseEventImpl (System. Windows.DependencyObject отправитель = {System.Windows.Controls.RichTextBox}, System.Windows.RoutedEventArgs арг = {System.Windows.Input.CanExecuteRoutedEventArgs}) + 0x3f байт
  • PresentationCore.dll! System.Windows. UIElement.RaiseEvent (System.Windows.RoutedEventArgs args = {System.Windows.Input.CanExecuteRoutedEventArgs}, BOOL доверенной) + 0x35 байты
  • PresentationCore.dll! System.Windows.Input.RoutedCommand.CriticalCanExecuteWrapper (объект параметра, целевая System.Windows.IInputElement, BOOL доверенной , System.Windows.Input.CanExecuteRoutedEventArgs аргументы) + 0x80 байт
    PresentationCore.dll! System.Windows.Input.RoutedCommand.CanExecuteImpl (объект параметр = NULL, System.Windows.IInputElement TARGET = {System.Windows .Controls.RichTextBox}, bool trusted = false, out bool co ntinueRouting = ложь) + 0x70 байт
  • PresentationCore.dll! System.Windows.Input.RoutedCommand.CriticalCanExecute (объект параметр, целевой System.Windows.IInputElement, BOOL доверяли, из BOOL continueRouting) + 0x3a байт
  • PresentationCore.dll! System.Windows.Input.CommandManager.TransferEvent (System.Windows.IInputElement Newsource, System.Windows.Input.CanExecuteRoutedEventArgs е = {System.Windows.Input.CanExecuteRoutedEventArgs}) + 0x52 байт
  • PresentationCor e.dll! System.Windows.Input.CommandManager.OnCanExecute (объект отправителя, System.Windows.Input.CanExecuteRoutedEventArgs е) + 0x8c байтов
    PresentationCore.dll! System.Windows.UIElement.OnCanExecuteThunk (объект отправителя, System.Windows.Input.CanExecuteRoutedEventArgs е) + 0x44 байт
  • PresentationCore.dll! System.Windows.Input.CanExecuteRoutedEventArgs.InvokeEventHandler (System.Delegate genericHandler, целевой объект) + 0x41 байт
    PresentationCore.dll! System.Windows.RoutedEventArgs.InvokeHandler (System.Delegate обработчика, целевой объект) + 0x27 байт PresentationCore.dll! System.Windows.RoutedEventHandlerInfo.InvokeHandler (объект мишени, System.Windows.RoutedEventArgs RoutedEventArgs) + 0x3e байты
    системы PresentationCore.dll!. Windows.EventRoute.InvokeHandlersImpl (объектисточник = {System.Windows.Controls.RichTextBox}, System.Windows.RoutedEventArgs арг = {System.Windows.Input.CanExecuteRoutedEventArgs}, BOOL ререйз = ложь) + 0x1bf байты
  • системы
  • PresentationCore.dll! .Windows.UIElement.RaiseEventImpl (System.Windows.DependencyObject отправитель = {System.Windows.Controls.RichTextBox}, System.Windows.RoutedEventArgs арг = + 0x79 байт
  • PresentationCore.dll! System.Windows.UIElement. RaiseEvent (System.Windows.RoutedEventArgs args = {System.Windows.Input.CanExecuteRoutedEventArgs}, BOOL доверенного) + 0x35 байты
  • PresentationCore.dll! System.Windows.Input.RoutedCommand.CriticalCanExecuteWrapper (объект параметра, System.Windows.IInputElement мишеней, BOOL доверенной, System.Windows.Input.CanExecuteRoutedEventArgs арга) + 0x80 байт

Похоже, что приложение застряло в бесконечной петле. Это моя вина (и что я делаю неправильно) или ошибка в .NET 3.5?

Я использую этот код:

MenuItem mi = new MenuItem(); 
mi.Command = ApplicationCommands.Open; 
FileMenu.Items.Add(mi); 

Это не имеет значения Wheter Я создаю MENUITEM с помощью кода или XAML, и, как я сказал, установка команды также не имеет значения, где. Проблема также возникает при использовании MediaCommands, поэтому я предполагаю, что для всех команд вообще.

Код RichTextBox:

//configure richtextbox 
sb = new RichTextBox(); 
sb.Margin = new Thickness(-3); 
sb.BorderThickness = new Thickness(0); 
sb.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto; 
sb.VerticalScrollBarVisibility = ScrollBarVisibility.Auto; 
///TODO: get font from preferences. 
FontFamilyConverter ffc = new FontFamilyConverter(); 
sb.FontFamily = (FontFamily)ffc.ConvertFromString("Lucida Sans Unicode"); 
sb.FontSize = 13; 
sb.AcceptsReturn = true; sb.AcceptsTab = true; 
sb.AllowDrop = true; sb.IsDocumentEnabled = false; 
sb.Padding = new Thickness(5); 

//markup styles 
Style s = new Style(typeof(Paragraph)); 
s.Setters.Add(new Setter(Paragraph.MarginProperty, new Thickness(0))); 
sb.Resources.Add(typeof(Paragraph), s); 

this.AddChild(sb); 

RichTextBox добавляется в конструктор элемента управления, который является производным от TabItem.

+0

Где находится этот код? Какой метод он использует? – Yohnny

+0

Код находится в конструкторе окна. Неважно, устанавливаю ли я команду перед тем, как MenuItem добавлен в меню или после, я попробовал оба. – Ruud

+0

Для меня странно видеть System.Windows.Controls.RichTextBox как отправителя в этой трассе стека. –

ответ

0

Я нашел проблему. Я добавлял RichTextBox в фокус-группу. Я удалил это, и теперь он работает. Хотя я еще не могу получить фокус клавиатуры в RichTextBox при запуске. (Tried Keyboard.Focus (sb), sb.Focus(), sb.Document.Focus(), Keyboard.Focus (sb.Document), FocusManager.SetFocusedElement (this, sb), ect ...

0

Да, это твоя ошибка, а не ошибка в 3,5 (эй, ты спросил). Теперь, чтобы найти вашу ошибку ...

Из трассировки стека есть много событий CanExecute, и они, похоже, связаны с RichTextBox. Есть ли в вашем коде логика CanExecute? Честно говоря, нам нужно больше кода для эффективной работы.

Кроме того, бесконечный цикл и переполнение стека различны. Ваша программа когда-либо взорвалась с исключением SO или она просто продолжала работать вечно?

+0

Нет, просто ошибка StackOverflow. У меня нет логики CanExecute в моем коде. (Я добавил код RichTextbox на мой вопрос). – Ruud

+0

Вы должны иметь какой-то рекурсивный/круговой вызов. Есть ли у вас какие-либо обработчики событий, которые делают какую-то логику, они не должны быть? –

+0

Я сделал еще один тест, и выясняется, что не все команды возвращают ошибку ... ApplicationCommands.Undo doens't. – Ruud

Смежные вопросы