Переполнение стека при открытии меню с ApplicationCommands в C # - PullRequest
0 голосов
/ 10 июля 2009

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

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

  • WindowsBase.dll! MS.Utility.ArrayItemList.ArrayItemList (интермедиат размер) + 0x20 байт
  • WindowsBase.dll! MS.Utility.FrugalStructList.Capacity.set (интермедиат значение) + 0x6a байт
  • WindowsBase.dll! MS.Utility.FrugalStructList.FrugalStructList (интермедиат размер) + 0x9 байт
  • PresentationCore.dll! System.Windows.EventRoute.EventRoute (System.Windows.RoutedEvent 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 args = {System.Windows.Input.CanExecuteRoutedEventArgs}) + 0x3f байт
  • PresentationCore.dll! System.Windows.UIElement.RaiseEvent (System.Windows.RoutedEventArgs args = {}, System.Windows.Input.CanExecuteRoutedEventArgs bool trust) + 0x35 байт
  • PresentationCore.dll! System.Windows.Input.RoutedCommand.CriticalCanExecuteWrapper (объект параметр, Цель System.Windows.IInputElement, бул доверял, System.Windows.Input.CanExecuteRoutedEventArgs args) + 0x80 байт
    PresentationCore.dll! System.Windows.Input.RoutedCommand.CanExecuteImpl (объект параметр = ноль, System.Windows.IInputElement target = {} System.Windows.Controls.RichTextBox, bool trust = false, out bool continueRouting = false) + 0x70 байт
  • PresentationCore.dll! System.Windows.Input.RoutedCommand.CriticalCanExecute (объект параметр, Цель System.Windows.IInputElement, бул доверял, бул continueRouting) + 0x3a байт
  • PresentationCore.dll! System.Windows.Input.CommandManager.TransferEvent (System.Windows.IInputElement Newsource, System.Windows.Input.CanExecuteRoutedEventArgs е = {System.Windows.Input.CanExecuteRoutedEventArgs}) + 0x52 байта
  • PresentationCore.dll! System.Windows.Input.CommandManager.OnCanExecute (объект отправитель, System.Windows.Input.CanExecuteRoutedEventArgs д) + 0x8c байт
    PresentationCore.dll! System.Windows.UIElement.OnCanExecuteThunk (объект отправитель, System.Windows.Input.CanExecuteRoutedEventArgs д) + 0х44 байта
  • 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! System.Windows.EventRoute.InvokeHandlersImpl (объект источник = {} System.Windows.Controls.RichTextBox, System.Windows.RoutedEventArgs args = {}, System.Windows.Input.CanExecuteRoutedEventArgs bool reRaised = false) + 0x1bf байт
  • PresentationCore.dll! System.Windows.UIElement.RaiseEventImpl (System.Windows.DependencyObject отправитель = {} System.Windows.Controls.RichTextBox, System.Windows.RoutedEventArgs args = + 0x79 байт
  • PresentationCore.dll! System.Windows.UIElement.RaiseEvent (System.Windows.RoutedEventArgs args = {}, System.Windows.Input.CanExecuteRoutedEventArgs bool trust) + 0x35 байт
  • PresentationCore.dll! System.Windows.Input.RoutedCommand.CriticalCanExecuteWrapper (объект параметр, Цель System.Windows.IInputElement, бул доверял, System.Windows.Input.CanExecuteRoutedEventArgs args) + 0x80 байт

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

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

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

Неважно, когда я создаю пункт меню с помощью кода или в 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.

Ответы [ 2 ]

0 голосов
/ 10 июля 2009

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

0 голосов
/ 10 июля 2009

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

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

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

...