2010-09-10 2 views
1

équipe Cher, voici mon problème:Silverlight accident après le gestionnaire d'événement bouton exécution

l'intérieur d'un contrôle que j'ai un numéro générique (je sais que lors de l'exécution) des contrôles sous. Chaque sous-contrôle est un LanguageTextView qui contient un éditeur de texte enrichi de Liquid. Un bouton permet de contrôler la manière dont ces textes enrichis doivent être affichés à l'intérieur du contrôle parent. Il existe deux options: un seul LanguageTextView ou tous les éléments LanguageTextView espacés de manière égale dans le contrôle parent.

Pour résoudre ce problème, j'ai utilisé une grille dans le conteneur. Avec code derrière je remplir la grille avec des textes riches sur l'événement « charge »:

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 est un dictionnaire qui est passé à un contrôleur de réseau avec l'objet de la grille de contrôle. Le contrôleur de grille, appelé MultiLanguageGridController, gère la manière dont LanguageTextView doit être affiché dans la grille (un seul objet ou tous les objets ensemble). Comme première étape, lorsque créée, lieu de l'unité de commande de grille du LanguageTextView une par colonne avec le code suivant:

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++; 
    } 

Pour contrôler la mise en page, il existe deux méthodes: showAllObjects et showSingleObjet (objectid).

showAllObject est comme ceci:

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

showSingleObject est la suivante:

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

Lorsque le bouton de commande est enfoncé, l'événement touche est traitée de cette façon:

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

IsShowAllLanguages est une propriété qui déclenche une propriété a changé d'événement. événement a changé la propriété est interceptée et traitée de cette façon:

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

    return; 
    } 

Où _gridCtrl est une référence à MultiLanguageGridController. Après un deuxième aller-retour sur la gestion des événements de bouton, l'application se bloque. Débogage l'application, je configurer un point de rupture à la dernière ligne du bouton gestionnaire d'événements clich comme suit:

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 
} 

Chaque fois que le bouton de commande est enfoncé, le point de rupture est atteint, mais juste après la sortie du procédé de pressage F10 (Visual Studio 2010), l'application s'arrête et après je reçois une exception:

Une exception non gérée de type 'System.AccessViolationException' s'est produite dans System.Windows.dll. Essayer de lire la mémoire protégée.

Je ne suis pas en mesure de procéder au débogage en dehors de la méthode du gestionnaire d'événements! Des idées?

Merci d'avance pour tout support.

+0

Pourriez-vous afficher la définition de ModuleListItemData? Aussi, juste pour confirmer que tout cela est dans un code de formulaires derrière vous n'utilisez pas une approche MVVM? Merci. – Rus

Répondre

0

Etrange mais vrai, la solution est de changer l'inclusion de 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" 

Ce résolu le problème.

Questions connexes