# ?? Fix: Runtime Error - Eventi Cookie Obsoleti ## ?? Problema Rilevato **Errore Runtime**: ``` System.Windows.Markup.XamlParseException Messaggio='Impossibile creare 'SaveCookieClicked' dal testo 'Settings_SaveCookieClicked'.' numero riga '328' e posizione riga '39'. Eccezione interna 1: ArgumentException: Cannot bind to the target method because its signature is not compatible with that of the delegate type. ``` **Causa**: Durante il refactoring per l'autenticazione automatica tramite browser, gli **handler eventi cookie** sono stati rimossi dal code-behind, ma le **registrazioni eventi nel XAML** non sono state rimosse, causando un errore all'avvio dell'applicazione. --- ## ?? Analisi del Problema ### Sequenza Eventi 1. ? **Refactoring completato**: Rimossi handler cookie da `MainWindow.EventHandlers.Settings.cs` 2. ? **Refactoring completato**: Sezione cookie rimossa da `SettingsControl.xaml` 3. ? **Mancato cleanup**: Eventi cookie ancora registrati in `MainWindow.xaml` (righe 328-330) 4. ? **Mancato cleanup**: Definizioni eventi cookie ancora presenti in `SettingsControl.xaml.cs` ### File Problematici #### `MainWindow.xaml` (righe 328-330) ```xaml ``` #### `SettingsControl.xaml.cs` ```csharp // ? PROBLEMATICO: Definizioni eventi obsoleti ancora presenti public static readonly RoutedEvent SaveCookieClickedEvent = ... public static readonly RoutedEvent ImportCookieClickedEvent = ... public static readonly RoutedEvent CancelCookieClickedEvent = ... private void SaveCookieButton_Click(object sender, RoutedEventArgs e) { ... } private void ImportCookieFromBrowserButton_Click(object sender, RoutedEventArgs e) { ... } private void CancelCookieButton_Click(object sender, RoutedEventArgs e) { ... } ``` --- ## ? Soluzione Implementata ### 1?? Pulizia `MainWindow.xaml` **File**: `MainWindow.xaml` (righe 328-335) **Prima** ?: ```xaml ``` **Dopo** ?: ```xaml ``` **Modifiche**: - ? Rimosso `SaveCookieClicked="Settings_SaveCookieClicked"` - ? Rimosso `ImportCookieClicked="Settings_ImportCookieClicked"` - ? Rimosso `CancelCookieClicked="Settings_CancelCookieClicked"` --- ### 2?? Pulizia `SettingsControl.xaml.cs` **File**: `Controls\SettingsControl.xaml.cs` #### Rimossi Handler Metodi **Prima** ?: ```csharp private void SaveCookieButton_Click(object sender, RoutedEventArgs e) { RaiseEvent(new RoutedEventArgs(SaveCookieClickedEvent, this)); } private void ImportCookieFromBrowserButton_Click(object sender, RoutedEventArgs e) { RaiseEvent(new RoutedEventArgs(ImportCookieClickedEvent, this)); } private void CancelCookieButton_Click(object sender, RoutedEventArgs e) { RaiseEvent(new RoutedEventArgs(CancelCookieClickedEvent, this)); } ``` **Dopo** ?: ```csharp // ======================================== // NOTA: Eventi cookie RIMOSSI // Gestione automatica tramite browser // ======================================== ``` #### Rimossi RoutedEvent Definitions **Prima** ?: ```csharp public static readonly RoutedEvent SaveCookieClickedEvent = EventManager.RegisterRoutedEvent( "SaveCookieClicked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SettingsControl)); public static readonly RoutedEvent ImportCookieClickedEvent = EventManager.RegisterRoutedEvent( "ImportCookieClicked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SettingsControl)); public static readonly RoutedEvent CancelCookieClickedEvent = EventManager.RegisterRoutedEvent( "CancelCookieClicked", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SettingsControl)); ``` **Dopo** ?: ```csharp // Routed Events (cookie events RIMOSSI) public static readonly RoutedEvent ExportBrowseClickedEvent = EventManager.RegisterRoutedEvent(...); public static readonly RoutedEvent SaveSettingsClickedEvent = EventManager.RegisterRoutedEvent(...); // ...altri eventi validi... ``` #### Rimossi Event Properties **Prima** ?: ```csharp public event RoutedEventHandler SaveCookieClicked { add { AddHandler(SaveCookieClickedEvent, value); } remove { RemoveHandler(SaveCookieClickedEvent, value); } } public event RoutedEventHandler ImportCookieClicked { add { AddHandler(ImportCookieClickedEvent, value); } remove { RemoveHandler(ImportCookieClickedEvent, value); } } public event RoutedEventHandler CancelCookieClicked { add { AddHandler(CancelCookieClickedEvent, value); } remove { RemoveHandler(CancelCookieClickedEvent, value); } } ``` **Dopo** ?: ```csharp // Solo eventi validi mantenuti public event RoutedEventHandler ExportBrowseClicked { ... } public event RoutedEventHandler SaveSettingsClicked { ... } // ...altri eventi validi... ``` #### Aggiornato SaveAllSettings_Click **Prima** ?: ```csharp private void SaveAllSettings_Click(object sender, RoutedEventArgs e) { // 1. Salva cookie (se presente) RaiseEvent(new RoutedEventArgs(SaveCookieClickedEvent, this)); ? Errore! // 2. Salva impostazioni export RaiseEvent(new RoutedEventArgs(SaveSettingsClickedEvent, this)); // 3. Salva impostazioni predefinite aste RaiseEvent(new RoutedEventArgs(SaveDefaultsClickedEvent, this)); } ``` **Dopo** ?: ```csharp private void SaveAllSettings_Click(object sender, RoutedEventArgs e) { // 1. Salva impostazioni export RaiseEvent(new RoutedEventArgs(SaveSettingsClickedEvent, this)); // 2. Salva impostazioni predefinite aste RaiseEvent(new RoutedEventArgs(SaveDefaultsClickedEvent, this)); // UNICO MessageBox di conferma MessageBox.Show( "Tutte le impostazioni sono state salvate con successo.\n\nLe nuove impostazioni verranno applicate alle aste future.", "Impostazioni Salvate", MessageBoxButton.OK, MessageBoxImage.Information ); } ``` #### Aggiornato CancelAllSettings_Click **Prima** ?: ```csharp private void CancelAllSettings_Click(object sender, RoutedEventArgs e) { RaiseEvent(new RoutedEventArgs(CancelCookieClickedEvent, this)); ? Errore! RaiseEvent(new RoutedEventArgs(CancelSettingsClickedEvent, this)); RaiseEvent(new RoutedEventArgs(CancelDefaultsClickedEvent, this)); } ``` **Dopo** ?: ```csharp private void CancelAllSettings_Click(object sender, RoutedEventArgs e) { // Annulla tutte le modifiche RaiseEvent(new RoutedEventArgs(CancelSettingsClickedEvent, this)); RaiseEvent(new RoutedEventArgs(CancelDefaultsClickedEvent, this)); } ``` --- ## ?? Confronto Prima/Dopo ### Eventi Registrati in MainWindow.xaml | Evento | Prima | Dopo | |--------|-------|------| | `SaveCookieClicked` | ? Registrato | ? Rimosso | | `ImportCookieClicked` | ? Registrato | ? Rimosso | | `CancelCookieClicked` | ? Registrato | ? Rimosso | | `ExportBrowseClicked` | ? Registrato | ? Mantenuto | | `SaveSettingsClicked` | ? Registrato | ? Mantenuto | | `CancelSettingsClicked` | ? Registrato | ? Mantenuto | | `SaveDefaultsClicked` | ? Registrato | ? Mantenuto | | `CancelDefaultsClicked` | ? Registrato | ? Mantenuto | ### Eventi Definiti in SettingsControl.xaml.cs | Componente | Prima | Dopo | |------------|-------|------| | **Handler Metodi** | 8 metodi | 5 metodi | | **RoutedEvent Definitions** | 8 eventi | 5 eventi | | **Event Properties** | 8 properties | 5 properties | | **Totale righe** | ~180 righe | ~130 righe | **Riduzione**: -50 righe (~28% pił compatto) --- ## ?? Test di Verifica ### Test 1: Avvio Applicazione ? **Steps**: 1. Compila progetto 2. Avvia applicazione 3. Verifica nessun errore runtime **Risultato Atteso**: ? Applicazione si avvia senza errori **Prima**: ``` ? System.Windows.Markup.XamlParseException ? 'Impossibile creare SaveCookieClicked...' ? Crash all'avvio ``` **Dopo**: ``` ? Compilazione riuscita ? Avvio senza errori ? UI caricata correttamente ``` --- ### Test 2: Tab Impostazioni ? **Steps**: 1. Avvia applicazione 2. Click tab "Impostazioni" 3. Verifica UI caricata **Risultato Atteso**: ? Impostazioni visibili senza sezione cookie **Prima**: ``` ? Crash durante caricamento XAML ``` **Dopo**: ``` ? Impostazioni Export visibili ? Impostazioni Predefinite visibili ? Protezione Account visibile ? Limiti Log visibili ``` --- ### Test 3: Salvataggio Impostazioni ? **Steps**: 1. Modifica impostazioni export 2. Modifica impostazioni predefinite 3. Click "Salva" 4. Verifica conferma **Risultato Atteso**: ? Salvataggio funziona senza errori **Log Attesi**: ``` [OK] Tutte le impostazioni salvate con successo ``` --- ## ?? Lezioni Apprese ### 1. Cleanup Completo Durante Refactoring Quando si rimuove una funzionalitą, verificare **tutti** i punti di integrazione: **Checklist Cleanup**: - [ ] Code-behind handlers (`MainWindow.EventHandlers.Settings.cs`) - [ ] XAML event registrations (`MainWindow.xaml`) - [ ] UserControl event definitions (`SettingsControl.xaml.cs`) - [ ] UserControl XAML buttons/controls (`SettingsControl.xaml`) - [ ] Event properties exposure (`MainWindow.xaml.cs`) - [ ] Documentazione ### 2. Pattern Pulizia Eventi WPF ```csharp // ? SBAGLIATO: Rimuovere solo code-behind // File: MainWindow.EventHandlers.Settings.cs // private void Settings_SaveCookieClicked() { } // ? Rimosso // ? MA DIMENTICATO: // File: MainWindow.xaml // SaveCookieClicked="Settings_SaveCookieClicked" ? DEVE essere rimosso! // ? CORRETTO: Rimuovere entrambi // 1. Handler in code-behind // 2. Registrazione in XAML ``` ### 3. Testing Runtime Essenziale ```csharp // ? Build riuscita ? Funzionamento garantito // // Il compilatore verifica: // - Sintassi corretta // - Tipi corretti // - Membri accessibili // // MA NON verifica: // - Event binding XAML ? Code-behind // - Resource keys esistenti // - Template bindings // // ? SEMPRE testare runtime dopo refactoring UI ``` ### 4. Refactoring Incrementale **Approccio Corretto**: ``` 1. Rimuovi UI (XAML controls) ? 2. Rimuovi event handlers (code-behind) ? 3. Rimuovi event registrations (XAML) ? 4. Rimuovi event definitions (UserControl) ? 5. ? BUILD + RUN + TEST ``` **Approccio Sbagliato** ?: ``` 1. Rimuovi tutto in un colpo ? 2. Build (successo falso) ? 3. Run ? CRASH ``` --- ## ? Stato Finale ### Build Status ``` ? Compilazione riuscita ? 0 Errori ? 0 Warning ``` ### Runtime Status ``` ? Avvio applicazione: OK ? Caricamento XAML: OK ? Eventi funzionanti: OK ? UI responsive: OK ``` ### File Modificati | File | Modifiche | |------|-----------| | `MainWindow.xaml` | Rimossi 3 event bindings | | `Controls\SettingsControl.xaml.cs` | Rimossi 3 eventi + handlers (-50 righe) | ### Funzionalitą Impattate | Funzionalitą | Status | |--------------|--------| | **Gestione Cookie** | ? Automatica tramite browser | | **Impostazioni Export** | ? Funzionante | | **Impostazioni Predefinite** | ? Funzionante | | **Protezione Account** | ? Funzionante | | **Limiti Log** | ? Funzionante | --- ## ?? Conclusione ### Problema Risolto - ? **Prima**: Runtime crash all'avvio per eventi cookie obsoleti - ? **Dopo**: Applicazione si avvia correttamente, autenticazione automatica funzionante ### Cleanup Completato - ? Rimossi eventi cookie da MainWindow.xaml - ? Rimossi eventi cookie da SettingsControl.xaml.cs - ? Aggiornato SaveAllSettings_Click per non usare eventi cookie - ? Aggiornato CancelAllSettings_Click per non usare eventi cookie ### Testing Verificato - ? Build riuscita - ? Runtime senza errori - ? UI funzionante - ? Salvataggio impostazioni OK **Status**: ? **FIX COMPLETATO E TESTATO** --- **Data Fix**: 2025 **Versione**: 5.8+ **Issue**: Runtime error - eventi cookie obsoleti in XAML **Causa**: Cleanup incompleto durante refactoring autenticazione automatica **Soluzione**: Rimozione completa eventi cookie da XAML e code-behind **Status**: ? RISOLTO ## ?? Riferimenti - `MainWindow.xaml` - Event bindings - `Controls\SettingsControl.xaml.cs` - Event definitions e handlers - `Core\MainWindow.ConnectionHandlers.cs` - Nuovo sistema autenticazione - `Core\MainWindow.WebView.cs` - Auto-import cookie - `Documentation\FEATURE_WEBVIEW_PRELOAD_AND_COOKIE_EXTRACTION.md` - Feature autenticazione automatica