2010-10-25 24 views
10

trascorro la maggior parte del mio tempo lo sviluppo di controlli sia per WPF e Silverlight utilizzando la stessa base di codice. Per fare ciò aggiungo file esistenti da un progetto (ad esempio Silverlight) "come collegamenti" all'altro (ad esempio WPF). Per piccole differenze che uso direttive del preprocessore comeVisual Studio: "Questo documento è aperto da un altro progetto"

#if SILVERLIGHT 
... 
#else 
... 
#endif 

Il codice in questi blocchi è in grigio a seconda del tipo di progetto hai aperto il file da. Quindi se apri il tuo file dal progetto Silverlight (dove è definito SILVERLIGHT) la parte else è grigia e Intellisense non funziona.

Affinché WPF parte da lavorare da IDE (con il colorante e il supporto Intellisense) è necessario aprire il file dal progetto WPF. Quando si tenta di fare che si ottiene una finestra di messaggio dicendo che "Questo documento è aperto da un altro progetto" e quando si fa clic su OK viene visualizzato il file nel contesto del progetto Silverlight (non quello che volevo vedere). Quindi devo chiudere il file, navigare nuovamente nel progetto WPF e riaprire il file. Questo è molto, molto fastidioso.

Quindi la domanda è questa: c'è una sorta di impostazione o componente aggiuntivo che farebbe riaprire Visual Studio dal file in cui ho fatto doppio clic su di esso invece di mostrare quella stupida casella di messaggio e mostrandomi quel file dal progetto "sbagliato"?

+4

Finora nessuna soluzione per questo problema oltre alla chiusura del file. Inoltre, è la ragione per la dll che blocca l'eccezione "Impossibile costruire il ..." in VS2010. –

+0

Mi chiedo se sia teoricamente possibile che il componente aggiuntivo gestisca questo aspetto: ricevere una notifica prima che l'utente tenti di aprire un file, verificare se lo stesso file è già stato aperto da un altro progetto, chiudere il file e riaprire dal progetto corrente. Sembra fattibile se tali API sono disponibili. –

+1

Uomo, sarebbe davvero buono. È fastidioso dover chiudere e aprire il file tutto il tempo. – andrecarlucci

risposta

2

È possibile semplificare l'utilizzo di questo argomento utilizzando classi parziali e più file: codice condiviso uguale per WPF e Silverlight in un file condiviso condiviso e un file separato per ciascuno contenente il codice specifico per uno o l'altro (con identico metodo/proprietà firme), ognuno dei quali è solo in uno dei progetti. In questo modo è possibile aprire contemporaneamente sia le versioni WPF sia Silverlight (poiché si tratta di file separati) al costo di aggiungere una serie di overhead di gestione dei file aggiuntivi.

di là di questo, un po 'di memoria in più e utilizzare soluzioni separate.

+0

Condivido i file tra due progetti nella stessa soluzione e il povero VS mi dà costantemente questo messaggio "aperto da un altro progetto". Questo bug è stato lì per più versioni di VS (sto usando VS2015). Mi chiedo se qualcuno lo ha segnalato a MSFT quindi ne sono consapevoli. –

4

questo è successo a me circa due volte in un mese ormai, non in un'applicazione WPF. Non ho idea del perché avvenga, ma in entrambi i casi la soluzione era Pulire la soluzione, riavviare il PC (non solo riavviare Visual Studio) e quindi creare la soluzione.

1

Sì questo è possibile utilizzando Visual Studio Shell.

primo oggetto un'istanza di EnvDTE80.DTE2:

private static EnvDTE80.DTE2 _dte; 

public static EnvDTE80.DTE2 DTE 
{ 
    get 
    { 
     if (_dte == null) 
      _dte = ServiceProvider.GlobalProvider.GetService(typeof(DTE)) as DTE2; 

     return _dte; 
    } 
} 

e poi:

// On Document Opening, close the existing instances. 
// This event occurs when you double-click file in Solution Explorer. 

DTE.Events.DocumentEvents.DocumentOpening += (s, e) => 
{ 
    if(!DTE.ItemOperations.IsFileOpen(YOURFILENAME)) 
     return; 

    foreach(Window win in DTE.Documents.Cast<Document>() 
         .FirstOrDefault(s => s.FullName == YOURFILENAME).Windows)) 
     win.Close(); 
} 

// next; VS itself will call DTE.ItemOperatins.OpenFile(YOURFILENAME); 

HTH.

1

Mi è venuto in mente quando ho avuto un progetto contenente un file collegato di un altro progetto in una soluzione VS. Quando ho cercato di passare alla definizione di un metodo in un file collegato, VS ha chiesto con un messaggio che questo documento è stato aperto da un altro progetto.

Per risolvere questo problema, ho dovuto scaricare il progetto che possiede il file originale dalla soluzione VS. In seguito, la navigazione nella definizione del metodo in tempo normale e tempo di debug non era un problema.

Problemi correlati