Zarządzanie projektami uniwersalnymi systemu Windows
Aplikacje uniwersalne systemu Windows to aplikacje przeznaczone zarówno dla systemów Windows 8.1, jak i Windows Telefon 8.1, dzięki czemu deweloperzy mogą używać kodu i innych zasobów na obu platformach. Udostępniony kod i zasoby są przechowywane w udostępnionym projekcie, podczas gdy kod i zasoby specyficzne dla platformy są przechowywane w osobnych projektach, jeden dla systemu Windows i drugi dla systemu Windows Telefon. Aby uzyskać więcej informacji na temat uniwersalnych aplikacji systemu Windows, zobacz Aplikacje uniwersalne systemu Windows. Rozszerzenia programu Visual Studio, które zarządzają projektami, powinny mieć świadomość, że projekty aplikacji uniwersalnych systemu Windows mają strukturę, która różni się od aplikacji jednoplatformowych. W tym przewodniku pokazano, jak nawigować po udostępnionym projekcie i zarządzać elementami udostępnionymi.
Nawigowanie po udostępnionym projekcie
Utwórz projekt VSIX języka C# o nazwie TestUniversalProject. (Plik>nowy>projekt, a następnie C#>Rozszerzalność>pakietu Visual Studio). Dodaj szablon elementu projektu Polecenia niestandardowego (na Eksplorator rozwiązań kliknij prawym przyciskiem myszy węzeł projektu i wybierz polecenie Dodaj>nowy element, a następnie przejdź do pozycji Rozszerzalność. Nadaj plikowi nazwę TestUniversalProject.
Dodaj odwołanie do biblioteki Microsoft.VisualStudio.Shell.Interop.12.1.DesignTime.dll i Microsoft.VisualStudio.Shell.Interop.14.0.DesignTime.dll (w sekcji Rozszerzenia).
Otwórz plik TestUniversalProject.cs i dodaj następujące
using
dyrektywy:using EnvDTE; using EnvDTE80; using Microsoft.VisualStudio; using Microsoft.VisualStudio.PlatformUI; using Microsoft.Internal.VisualStudio.PlatformUI; using System.Collections.Generic; using System.IO; using System.Windows.Forms;
TestUniversalProject
W klasie dodaj pole prywatne wskazujące okno Dane wyjściowe.public sealed class TestUniversalProject { IVsOutputWindowPane output; . . . }
Ustaw odwołanie do okienka danych wyjściowych wewnątrz konstruktora TestUniversalProject:
private TestUniversalProject(Package package) { if (package == null) { throw new ArgumentNullException("package"); } this.package = package; OleMenuCommandService commandService = this.ServiceProvider.GetService(typeof(IMenuCommandService)) as OleMenuCommandService; if (commandService != null) { CommandID menuCommandID = new CommandID(MenuGroup, CommandId); EventHandler eventHandler = this.ShowMessageBox; MenuCommand menuItem = new MenuCommand(eventHandler, menuCommandID); commandService.AddCommand(menuItem); } // get a reference to the Output window output = (IVsOutputWindowPane)ServiceProvider.GetService(typeof(SVsGeneralOutputWindowPane)); }
Usuń istniejący kod z
ShowMessageBox
metody :private void ShowMessageBox(object sender, EventArgs e) { }
Pobierz obiekt DTE, którego użyjemy do kilku różnych celów w tym przewodniku. Upewnij się również, że rozwiązanie jest ładowane po kliknięciu przycisku menu.
private void ShowMessageBox(object sender, EventArgs e) { var dte = (EnvDTE.DTE)this.ServiceProvider.GetService(typeof(EnvDTE.DTE)); if (dte.Solution != null) { . . . } else { MessageBox.Show("No solution is open"); return; } }
Znajdź udostępniony projekt. Projekt udostępniony jest czystym kontenerem; nie tworzy ani nie generuje danych wyjściowych. Poniższa metoda znajduje pierwszy udostępniony projekt w rozwiązaniu, wyszukując IVsHierarchy obiekt, który ma udostępnioną funkcję projektu.
private IVsHierarchy FindSharedProject() { var sln = (IVsSolution)this.ServiceProvider.GetService(typeof(SVsSolution)); Guid empty = Guid.Empty; IEnumHierarchies enumHiers; //get all the projects in the solution ErrorHandler.ThrowOnFailure(sln.GetProjectEnum((uint)__VSENUMPROJFLAGS.EPF_LOADEDINSOLUTION, ref empty, out enumHiers)); foreach (IVsHierarchy hier in ComUtilities.EnumerableFrom(enumHiers)) { if (PackageUtilities.IsCapabilityMatch(hier, "SharedAssetsProject")) { return hier; } } return null; }
W metodzie
ShowMessageBox
wyprowadź podpis (nazwę projektu wyświetlaną w Eksplorator rozwiązań) udostępnionego projektu.private void ShowMessageBox(object sender, EventArgs e) { var dte = (DTE)this.ServiceProvider.GetService(typeof(DTE)); if (dte.Solution != null) { var sharedHier = this.FindSharedProject(); if (sharedHier != null) { string sharedCaption = HierarchyUtilities.GetHierarchyProperty<string>(sharedHier, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID.VSHPROPID_Caption); output.OutputStringThreadSafe(string.Format("Found shared project: {0}\n", sharedCaption)); } else { MessageBox.Show("Solution has no shared project"); return; } } else { MessageBox.Show("No solution is open"); return; } }
Uzyskaj aktywny projekt platformy. Projekty platformy to projekty zawierające kod i zasoby specyficzne dla platformy. Poniższa metoda używa nowego pola VSHPROPID_SharedItemContextHierarchy do pobrania aktywnego projektu platformy.
private IVsHierarchy GetActiveProjectContext(IVsHierarchy hierarchy) { IVsHierarchy activeProjectContext; if (HierarchyUtilities.TryGetHierarchyProperty(hierarchy, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID7.VSHPROPID_SharedItemContextHierarchy, out activeProjectContext)) { return activeProjectContext; } else { return null; } }
W metodzie
ShowMessageBox
wyprowadź podpis aktywnego projektu platformy.private void ShowMessageBox(object sender, EventArgs e) { var dte = (DTE)this.ServiceProvider.GetService(typeof(DTE)); if (dte.Solution != null) { var sharedHier = this.FindSharedProject(); if (sharedHier != null) { string sharedCaption = HierarchyUtilities.GetHierarchyProperty<string>(sharedHier, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID.VSHPROPID_Caption); output.OutputStringThreadSafe(string.Format("Shared project: {0}\n", sharedCaption)); var activePlatformHier = this.GetActiveProjectContext(sharedHier); if (activePlatformHier != null) { string activeCaption = HierarchyUtilities.GetHierarchyProperty<string>(activePlatformHier, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID.VSHPROPID_Caption); output.OutputStringThreadSafe(string.Format("Active platform project: {0}\n", activeCaption)); } else { MessageBox.Show("Shared project has no active platform project"); } } else { MessageBox.Show("Solution has no shared project"); } } else { MessageBox.Show("No solution is open"); } }
Iterowanie za pośrednictwem projektów platformy. Poniższa metoda pobiera wszystkie projekty importowania (platformy) z udostępnionego projektu.
private IEnumerable<IVsHierarchy> EnumImportingProjects(IVsHierarchy hierarchy) { IVsSharedAssetsProject sharedAssetsProject; if (HierarchyUtilities.TryGetHierarchyProperty(hierarchy, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID7.VSHPROPID_SharedAssetsProject, out sharedAssetsProject) && sharedAssetsProject != null) { foreach (IVsHierarchy importingProject in sharedAssetsProject.EnumImportingProjects()) { yield return importingProject; } } }
Ważne
Jeśli użytkownik otworzył projekt uniwersalnej aplikacji systemu Windows w języku C++ w wystąpieniu eksperymentalnym, powyższy kod zgłasza wyjątek. Jest to znany problem. Aby uniknąć wyjątku, zastąp
foreach
powyższy blok następującymi elementami:var importingProjects = sharedAssetsProject.EnumImportingProjects(); for (int i = 0; i < importingProjects.Count; ++i) { yield return importingProjects[i]; }
W metodzie
ShowMessageBox
wyprowadź podpis każdego projektu platformy. Wstaw następujący kod po wierszu, który zwraca podpis aktywnego projektu platformy. Na tej liście są wyświetlane tylko załadowane projekty platformy.output.OutputStringThreadSafe("Platform projects:\n"); IEnumerable<IVsHierarchy> projects = this.EnumImportingProjects(sharedHier); bool isActiveProjectSet = false; foreach (IVsHierarchy platformHier in projects) { string platformCaption = HierarchyUtilities.GetHierarchyProperty<string>(platformHier, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID.VSHPROPID_Caption); output.OutputStringThreadSafe(string.Format(" * {0}\n", platformCaption)); }
Zmień aktywny projekt platformy. Poniższa metoda ustawia aktywny projekt przy użyciu polecenia SetProperty.
private int SetActiveProjectContext(IVsHierarchy hierarchy, IVsHierarchy activeProjectContext) { return hierarchy.SetProperty((uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID7.VSHPROPID_SharedItemContextHierarchy, activeProjectContext); }
W metodzie
ShowMessageBox
zmień aktywny projekt platformy. Wstaw ten kod wewnątrzforeach
bloku.bool isActiveProjectSet = false; string platformCaption = null; foreach (IVsHierarchy platformHier in projects) { platformCaption = HierarchyUtilities.GetHierarchyProperty<string>(platformHier, (uint)VSConstants.VSITEMID.Root, (int)__VSHPROPID.VSHPROPID_Caption); output.OutputStringThreadSafe(string.Format(" * {0}\n", platformCaption)); // if this project is neither the shared project nor the current active platform project, // set it to be the active project if (!isActiveProjectSet && platformHier != activePlatformHier) { this.SetActiveProjectContext(sharedHier, platformHier); activePlatformHier = platformHier; isActiveProjectSet = true; } } output.OutputStringThreadSafe("set active project: " + platformCaption +'\n');
Teraz wypróbuj to. Naciśnij klawisz F5, aby uruchomić wystąpienie eksperymentalne. Utwórz projekt aplikacji uniwersalnego centrum języka C# w wystąpieniu eksperymentalnym (w oknie dialogowym Nowy projekt, aplikacja uniwersalna>systemu Windows 8 systemu Windows C#>Windows>8).> Po załadowaniu rozwiązania przejdź do menu Narzędzia i kliknij pozycję Wywołaj testUniversalProject, a następnie sprawdź tekst w okienku Dane wyjściowe . Powinna zostać wyświetlona zawartość podobna do tej:
Found shared project: HubApp.Shared The active platform project: HubApp.Windows Platform projects: * HubApp.Windows * HubApp.WindowsPhone set active project: HubApp.WindowsPhone
Zarządzanie elementami udostępnionymi w projekcie platformy
Znajdź elementy udostępnione w projekcie platformy. Elementy w projekcie udostępnionym są wyświetlane w projekcie platformy jako elementy udostępnione. Nie można ich zobaczyć w Eksplorator rozwiązań, ale możesz przejść do hierarchii projektów, aby je znaleźć. Poniższa metoda przeprowadzi hierarchię i zbierze wszystkie elementy udostępnione. Opcjonalnie zwraca podpis każdego elementu. Elementy udostępnione są identyfikowane przez nową właściwość VSHPROPID_IsSharedItem.
private void InspectHierarchyItems(IVsHierarchy hier, uint itemid, int level, List<uint> itemIds, bool getSharedItems, bool printItems) { string caption = HierarchyUtilities.GetHierarchyProperty<string>(hier, itemid, (int)__VSHPROPID.VSHPROPID_Caption); if (printItems) output.OutputStringThreadSafe(string.Format("{0}{1}\n", new string('\t', level), caption)); // if getSharedItems is true, inspect only shared items; if it's false, inspect only unshared items bool isSharedItem; if (HierarchyUtilities.TryGetHierarchyProperty(hier, itemid, (int)__VSHPROPID7.VSHPROPID_IsSharedItem, out isSharedItem) && (isSharedItem == getSharedItems)) { itemIds.Add(itemid); } uint child; if (HierarchyUtilities.TryGetHierarchyProperty(hier, itemid, (int)__VSHPROPID.VSHPROPID_FirstChild, Unbox.AsUInt32, out child) && child != (uint)VSConstants.VSITEMID.Nil) { this.InspectHierarchyItems(hier, child, level + 1, itemIds, isSharedItem, printItems); while (HierarchyUtilities.TryGetHierarchyProperty(hier, child, (int)__VSHPROPID.VSHPROPID_NextSibling, Unbox.AsUInt32, out child) && child != (uint)VSConstants.VSITEMID.Nil) { this.InspectHierarchyItems(hier, child, level + 1, itemIds, isSharedItem, printItems); } } }
W metodzie
ShowMessageBox
dodaj następujący kod, aby przejść do elementów hierarchii projektu platformy. Wstaw go doforeach
bloku.output.OutputStringThreadSafe("Walk the active platform project:\n"); var sharedItemIds = new List<uint>(); this.InspectHierarchyItems(activePlatformHier, (uint)VSConstants.VSITEMID.Root, 1, sharedItemIds, true, true);
Odczytywanie elementów udostępnionych. Elementy udostępnione są wyświetlane w projekcie platformy jako ukryte połączone pliki i można odczytać wszystkie właściwości jako zwykłe połączone pliki. Poniższy kod odczytuje pełną ścieżkę pierwszego elementu udostępnionego.
var sharedItemId = sharedItemIds[0]; string fullPath; ErrorHandler.ThrowOnFailure(((IVsProject)activePlatformHier).GetMkDocument(sharedItemId, out fullPath)); output.OutputStringThreadSafe(string.Format("Shared item full path: {0}\n", fullPath));
Teraz wypróbuj to. Naciśnij klawisz F5 , aby uruchomić wystąpienie eksperymentalne. Utwórz projekt aplikacji uniwersalnego centrum języka C# w wystąpieniu eksperymentalnym (w oknie dialogowym Nowy projekt visual C#>Aplikacja uniwersalna>centrum systemu Windows 8 systemu Windows>8>) przejdź do menu Narzędzia i kliknij polecenie Wywołaj testUniversalProject, a następnie sprawdź tekst w okienku Dane wyjściowe. Powinna zostać wyświetlona zawartość podobna do tej:
Found shared project: HubApp.Shared The active platform project: HubApp.Windows Platform projects: * HubApp.Windows * HubApp.WindowsPhone set active project: HubApp.WindowsPhone Walk the active platform project: HubApp.WindowsPhone <HubApp.Shared> App.xaml App.xaml.cs Assets DarkGray.png LightGray.png MediumGray.png Common NavigationHelper.cs ObservableDictionary.cs RelayCommand.cs SuspensionManager.cs DataModel SampleData.json SampleDataSource.cs HubApp.Shared.projitems Strings en-US Resources.resw Assets HubBackground.theme-dark.png HubBackground.theme-light.png Logo.scale-240.png SmallLogo.scale-240.png SplashScreen.scale-240.png Square71x71Logo.scale-240.png StoreLogo.scale-240.png WideLogo.scale-240.png HubPage.xaml HubPage.xaml.cs ItemPage.xaml ItemPage.xaml.cs Package.appxmanifest Properties AssemblyInfo.cs References .NET for Windows Store apps HubApp.Shared Windows Phone 8.1 SectionPage.xaml SectionPage.xaml.cs
Wykrywanie zmian w projektach platformy i projektach udostępnionych
Zdarzenia hierarchii i projektu umożliwiają wykrywanie zmian w projektach udostępnionych, tak jak w przypadku projektów platformy. Jednak elementy projektu w udostępnionym projekcie nie są widoczne, co oznacza, że niektóre zdarzenia nie są wyzwalane po zmianie udostępnionych elementów projektu.
Rozważ sekwencję zdarzeń, gdy nazwa pliku w projekcie zostanie zmieniona:
Nazwa pliku jest zmieniana na dysku.
Plik projektu jest aktualizowany w celu uwzględnienia nowej nazwy pliku.
Zdarzenia hierarchii (na przykład IVsHierarchyEvents) zwykle śledzą zmiany wyświetlane w interfejsie użytkownika, jak w Eksplorator rozwiązań. Zdarzenia hierarchii uwzględniają operację zmiany nazwy pliku, która składa się z usunięcia pliku, a następnie dodawania pliku. Jednak w przypadku zmiany niewidocznych elementów system zdarzeń hierarchii uruchamia OnItemDeleted zdarzenie, ale nie OnItemAdded zdarzenie. W związku z tym jeśli zmienisz nazwę pliku w projekcie platformy, uzyskasz wartość i OnItemDeleted OnItemAdded, ale jeśli zmienisz nazwę pliku w udostępnionym projekcie, uzyskasz tylko OnItemDeletedwartość .
Aby śledzić zmiany w elementach projektu, można obsługiwać zdarzenia elementu projektu DTE (te znalezione w pliku ProjectItemsEventsClass). Jeśli jednak obsługujesz dużą liczbę zdarzeń, możesz uzyskać lepszą wydajność obsługi zdarzeń w programie IVsTrackProjectDocuments2. W tym przewodniku pokażemy tylko zdarzenia hierarchii i zdarzenia DTE. W tej procedurze dodasz odbiornik zdarzeń do udostępnionego projektu i projektu platformy. Następnie podczas zmiany nazwy jednego pliku w udostępnionym projekcie i innego pliku w projekcie platformy można zobaczyć zdarzenia, które są wyzwalane dla każdej operacji zmiany nazwy.
W tej procedurze dodasz odbiornik zdarzeń do udostępnionego projektu i projektu platformy. Następnie podczas zmiany nazwy jednego pliku w udostępnionym projekcie i innego pliku w projekcie platformy można zobaczyć zdarzenia, które są wyzwalane dla każdej operacji zmiany nazwy.
Dodaj odbiornik zdarzeń. Dodaj nowy plik klasy do projektu i wywołaj go HierarchyEventListener.cs.
Otwórz plik HierarchyEventListener.cs i dodaj następujące dyrektywy using:
using Microsoft.VisualStudio.Shell.Interop; using Microsoft.VisualStudio; using System.IO;
Zaimplementuj IVsHierarchyEventsklasę
HierarchyEventListener
:class HierarchyEventListener : IVsHierarchyEvents { }
Zaimplementuj elementy członkowskie elementu IVsHierarchyEvents, tak jak w poniższym kodzie.
class HierarchyEventListener : IVsHierarchyEvents { private IVsHierarchy hierarchy; IVsOutputWindowPane output; internal HierarchyEventListener(IVsHierarchy hierarchy, IVsOutputWindowPane outputWindow) { this.hierarchy = hierarchy; this.output = outputWindow; } int IVsHierarchyEvents.OnInvalidateIcon(IntPtr hIcon) { return VSConstants.S_OK; } int IVsHierarchyEvents.OnInvalidateItems(uint itemIDParent) { return VSConstants.S_OK; } int IVsHierarchyEvents.OnItemAdded(uint itemIDParent, uint itemIDSiblingPrev, uint itemIDAdded) { output.OutputStringThreadSafe("IVsHierarchyEvents.OnItemAdded: " + itemIDAdded + "\n"); return VSConstants.S_OK; } int IVsHierarchyEvents.OnItemDeleted(uint itemID) { output.OutputStringThreadSafe("IVsHierarchyEvents.OnItemDeleted: " + itemID + "\n"); return VSConstants.S_OK; } int IVsHierarchyEvents.OnItemsAppended(uint itemIDParent) { output.OutputStringThreadSafe("IVsHierarchyEvents.OnItemsAppended\n"); return VSConstants.S_OK; } int IVsHierarchyEvents.OnPropertyChanged(uint itemID, int propID, uint flags) { output.OutputStringThreadSafe("IVsHierarchyEvents.OnPropertyChanged: item ID " + itemID + "\n"); return VSConstants.S_OK; } }
W tej samej klasie dodaj kolejną procedurę obsługi zdarzeń dla zdarzenia ItemRenamedDTE , która występuje za każdym razem, gdy zmienia się nazwa elementu projektu.
public void OnItemRenamed(EnvDTE.ProjectItem projItem, string oldName) { output.OutputStringThreadSafe(string.Format("[Event] Renamed {0} to {1} in project {2}\n", oldName, Path.GetFileName(projItem.get_FileNames(1)), projItem.ContainingProject.Name)); }
Zarejestruj się w celu uzyskania zdarzeń hierarchii. Musisz zarejestrować się oddzielnie dla każdego śledzonego projektu. Dodaj następujący kod w
ShowMessageBox
pliku , jeden dla udostępnionego projektu, a drugi dla jednego z projektów platformy.// hook up the event listener for hierarchy events on the shared project HierarchyEventListener listener1 = new HierarchyEventListener(sharedHier, output); uint cookie1; sharedHier.AdviseHierarchyEvents(listener1, out cookie1); // hook up the event listener for hierarchy events on the active project HierarchyEventListener listener2 = new HierarchyEventListener(activePlatformHier, output); uint cookie2; activePlatformHier.AdviseHierarchyEvents(listener2, out cookie2);
Zarejestruj się, aby uzyskać zdarzenie ItemRenamedelementu projektu DTE . Dodaj następujący kod po podłączeniu drugiego odbiornika.
// hook up DTE events for project items Events2 dteEvents = (Events2)dte.Events; dteEvents.ProjectItemsEvents.ItemRenamed += listener1.OnItemRenamed;
Zmodyfikuj element udostępniony. Nie można modyfikować elementów udostępnionych w projekcie platformy; Zamiast tego należy zmodyfikować je w udostępnionym projekcie, który jest rzeczywistym właścicielem tych elementów. Możesz uzyskać odpowiedni identyfikator elementu w udostępnionym projekcie za pomocą IsDocumentInProjectpolecenia , nadając mu pełną ścieżkę elementu udostępnionego. Następnie możesz zmodyfikować element udostępniony. Zmiana jest propagowana do projektów platformy.
Ważne
Przed zmodyfikowaniem elementu projektu należy dowiedzieć się, czy element projektu jest elementem udostępnionym.
Poniższa metoda modyfikuje nazwę pliku elementu projektu.
private void ModifyFileNameInProject(IVsHierarchy project, string path) { int found; uint projectItemID; VSDOCUMENTPRIORITY[] priority = new VSDOCUMENTPRIORITY[1]; if (ErrorHandler.Succeeded(((IVsProject)project).IsDocumentInProject(path, out found, priority, out projectItemID)) && found != 0) { var name = DateTime.Now.Ticks.ToString() + Path.GetExtension(path); project.SetProperty(projectItemID, (int)__VSHPROPID.VSHPROPID_EditLabel, name); output.OutputStringThreadSafe(string.Format("Renamed {0} to {1}\n", path,name)); } }
Wywołaj tę metodę po wszystkim innym kodzie w pliku,
ShowMessageBox
aby zmodyfikować nazwę pliku w udostępnionym projekcie. Wstaw to po kodzie, który pobiera pełną ścieżkę elementu w udostępnionym projekcie.// change the file name of an item in a shared project this.InspectHierarchyItems(activePlatformHier, (uint)VSConstants.VSITEMID.Root, 1, sharedItemIds, true, true); ErrorHandler.ThrowOnFailure(((IVsProject)activePlatformHier).GetMkDocument(sharedItemId, out fullPath)); output.OutputStringThreadSafe(string.Format("Shared project item ID = {0}, full path = {1}\n", sharedItemId, fullPath)); this.ModifyFileNameInProject(sharedHier, fullPath);
Skompiluj i uruchom projekt. Utwórz aplikację uniwersalną centrum języka C# w wystąpieniu eksperymentalnym, przejdź do menu Narzędzia i kliknij pozycję Wywołaj testUniversalProject i sprawdź tekst w okienku danych wyjściowych ogólnych. Nazwa pierwszego elementu w projekcie udostępnionym (oczekujemy, że ItemRenamed będzie to plik App.xaml) powinna zostać zmieniona i powinna zostać wyświetlona wartość zdarzenia. W takim przypadku, ponieważ zmiana nazwy app.xaml powoduje, że nazwa pliku App.xaml.cs również powinna zostać zmieniona, powinny zostać wyświetlone cztery zdarzenia (dwa dla każdego projektu platformy). (Zdarzenia DTE nie śledzą elementów w udostępnionym projekcie). Powinny zostać wyświetlone dwa OnItemDeleted zdarzenia (jedno dla każdego projektu platformy), ale nie ma zdarzeń OnItemAdded .
Teraz spróbuj zmienić nazwę pliku w projekcie platformy i zobaczysz różnicę w zdarzeniach, które są wyzwalane. Dodaj następujący kod po
ShowMessageBox
wywołaniu metody .ModifyFileName
// change the file name of an item in a platform project var unsharedItemIds = new List<uint>(); this.InspectHierarchyItems(activePlatformHier, (uint)VSConstants.VSITEMID.Root, 1, unsharedItemIds, false, false); var unsharedItemId = unsharedItemIds[0]; string unsharedPath; ErrorHandler.ThrowOnFailure(((IVsProject)activePlatformHier).GetMkDocument(unsharedItemId, out unsharedPath)); output.OutputStringThreadSafe(string.Format("Platform project item ID = {0}, full path = {1}\n", unsharedItemId, unsharedPath)); this.ModifyFileNameInProject(activePlatformHier, unsharedPath);
Skompiluj i uruchom projekt. Utwórz projekt uniwersalny języka C# w wystąpieniu eksperymentalnym, przejdź do menu Narzędzia i kliknij pozycję Wywołaj testUniversalProject, a następnie sprawdź tekst w okienku danych wyjściowych ogólnych. Po zmianie nazwy pliku w projekcie platformy powinien zostać wyświetlony zarówno OnItemAdded zdarzenie, jak i OnItemDeleted zdarzenie. Ponieważ zmiana pliku nie spowodowała zmiany innych plików, a zmiany elementów w projekcie platformy nie są propagowane w dowolnym miejscu, istnieje tylko jeden z tych zdarzeń.