按钮事件处理程序执行后Silverlight崩溃

时间:2010-09-10 10:34:37

标签: silverlight

亲爱的团队,这是我的问题:

在控件内部,我有一个子控件的通用编号(我只在运行时知道)。 每个子控件都是一个LanguageTextView,它包含Liquid的富文本编辑器。 按钮用于控制如何在父控件中显示这些富文本。 有两个选项:单个LanguageTextView或在父控件内等间隔的所有LanguageTextView项。

为了解决这个问题,我在容器中使用了Grid。 有了代码,我在网格上填充了“加载”事件中的丰富文本:

foreach (OM_Language lang in LanguageDataManager.INSTANCE.ActiveLanguages) {

    LanguageTextView tb = new LanguageTextView();
    tb.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch;
    tb.HorizontalContentAlignment = System.Windows.HorizontalAlignment.Stretch;
    tb.HorizontalAlignment = HorizontalAlignment.Stretch;
    tb.HorizontalContentAlignment = HorizontalAlignment.Stretch;
    tb.init(lang);

    tb.onTextChangedEvent += new    LanguageTextView.onTextChangedEventType(tb_onTextChangedEvent);

    if ((_module.Texts != null) && (_module.Texts.ContainsKey(lang.OMID.Value))) {
      tb.Text = _module.Texts[lang.OMID.Value];
    }

    _textBoxList.Add(lang.OMID.Value, tb);
  }

_textBoxList是一个字典,它传递给网格控制器,并控制网格对象。网格控制器,称为MultiLanguageGridController,处理如何在网格内显示LanguageTextView(单个对象或所有对象在一起)。 作为第一步,在创建时,网格控制器将每列的LanguageTextView放置一个代码:

  int count = 0;
  foreach (int key in _uiElements.Keys) {
    FrameworkElement fe = _uiElements[key];

    ColumnDefinition cd = new ColumnDefinition();
    cd.Width = new GridLength(1, GridUnitType.Star);
    _cds.Add(key, cd);

    _grid.ColumnDefinitions.Add(cd);
    _grid.Children.Add(fe);

    Grid.SetColumn(fe, count);
    Grid.SetRow(fe, 0);

    count++;
  }

要控制布局,有两种方法:showAllObjects和showSingleObjet(objectid)。

showAllObject是这样的:

foreach (int key in _uiElements.Keys) {
  _cds[key].Width = new GridLength(1, GridUnitType.Star);
}

showSingleObject如下:

foreach(int key in _uiElements.Keys){
    if(key == objectId){
      _cds[key].Width = new GridLength(1, GridUnitType.Star);
    }else{
      _cds[key].Width = new GridLength(0);
    }
  }

按下控制按钮时,按钮事件将以这种方式处理:

  ModuleListItemData mld = this.DataContext as ModuleListItemData;
  if (mld == null) {
    return;
  }
  mld.IsShowAllLanguages = !mld.IsShowAllLanguages;

IsShowAllLanguages是一个触发属性更改事件的属性。 财产变更事件被截获并以这种方式处理:

  if ("IsShowAllLanguages".Equals(e.PropertyName)) {
    if (tmd.IsShowSingleLanguage) {
      _gridCtrl.showSingleObject(tmd.SelectedLanguage.OMID.Value);
    } else {
      _gridCtrl.showAllObjects();
    }

    return;
  }

其中_gridCtrl是对MultiLanguageGridController的引用。

按钮事件处理第二次往返后,应用程序崩溃。 调试应用程序,我在按钮clich事件处理程序的最后一行设置了一个断点,如下所示:

private void _btnShowAllLang_Click(object sender, RoutedEventArgs e) {
  ModuleListItemData mld = this.DataContext as ModuleListItemData;
  if (mld == null) {
    return;
  }
====>  mld.IsShowAllLanguages = !mld.IsShowAllLanguages; <=== Break point here
}

每次按下控制按钮时,都会到达断点,但是在退出方法按F10(visual studio 2010)后,应用程序停止并在我获得异常后停止:

System.Windows.dll中发生了未处理的“System.AccessViolationException”类型异常。试图读取受保护的内存。

我无法在事件处理程序方法之外进行调试! 任何想法??

提前感谢您的支持。

1 个答案:

答案 0 :(得分:0)

奇怪但真实,解决方案是改变XAML包含:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:controlsToolkit="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Toolkit"
xmlns:myConverters="clr-namespace:ArgoWeb.Utility.Data" 
mc:Ignorable="d" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
d:DesignWidth="608" d:DesignHeight="112"

为:

xmlns:my="clr-namespace:ArgoWeb.UI.UserControls.ModuleView"  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:local="clr-namespace:ArgoWeb.Utility.Data"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
mc:Ignorable="d" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
d:DesignWidth="482" d:DesignHeight="144" Height="100"

这解决了这个问题。