2012-01-02 18 views
10

Próbuję napisać rozszerzenie edytora Visual Studio. Mam pobrany zestaw SDK VS i utworzyłem nowy projekt pakietu Visual Studio. Jednak utworzona dla mnie kontrolka fikcyjna to formant Windows Forms, a nie formant WPF. Próbuję zastąpić go kontrolką WPF, ale nie tak dobrze. Czy to w ogóle możliwe?Visual Studio: jak pisać rozszerzenia edytora przy pomocy WPF

Inne powiązane pytanie: Czy można pisać redakcje tekstu? To, czego naprawdę chcę, to edytor, który wygląda bardziej jak formularz z wieloma różnymi dziedzinami. Ale wydaje się, że to nie jest to, do czego jest przeznaczony? Interfejs EditorPane zawiera wiele interfejsów, które implikują jedynie model edytora tekstu.

Idealnie chciałbym, aby edytor taki jak edytor-resx, w którym edytowany plik ma treść xml, a edytor-ui nie jest pojedynczym polem tekstowym i gdzie generowany plik cs jest wyprowadzany jako plik podrzędny. Czy można to zrobić z rozszerzeniami redaktora?

+0

W rozszerzeniach VS "Redaktorzy" są zwykle edytorami tekstu/kodu - być może zamiast tego chcesz utworzyć "Projektant". –

+0

Powiązane pytanie: [link] (http://stackoverflow.com/questions/18761221/visual-studio-2012-wpf-custom-design er-editor) – sgnsajgon

Odpowiedz

7

ta jest szczegółowo wyjaśnione tutaj: WPF in Visual Studio 2010 – Part 4 : Direct Hosting of WPF content

Tak więc, jeśli używasz standardowego rozciągliwość/próbkę Edytor klienta, który pochodzi z Visual Studio SDK, co można zrobić, aby go przetestować jest to,

1) modyfikowanie dostarczonego EditorFactory.cs pliku tak:

 // Create the Document (editor) 
     //EditorPane NewEditor = new EditorPane(editorPackage); // comment this line 
     WpfEditorPane NewEditor = new WpfEditorPane(); // add this line 

2) CRE jedli na przykład plik WpfEditorPane.cs takiego:

[ComVisible(true)] 
public class WpfEditorPane : WindowPane, IVsPersistDocData 
{ 
    private TextBox _text; 

    public WpfEditorPane() 
     : base(null) 
    { 
     _text = new TextBox(); // Note this is the standard WPF thingy, not the Winforms one 
     _text.Text = "hello world"; 
     Content = _text; // use any FrameworkElement-based class here. 
    } 

    #region IVsPersistDocData Members 
    // NOTE: these need to be implemented properly! following is just a sample 

    public int Close() 
    { 
     return VSConstants.S_OK; 
    } 

    public int GetGuidEditorType(out Guid pClassID) 
    { 
     pClassID = Guid.Empty; 
     return VSConstants.S_OK; 
    } 

    public int IsDocDataDirty(out int pfDirty) 
    { 
     pfDirty = 0; 
     return VSConstants.S_OK; 
    } 

    public int IsDocDataReloadable(out int pfReloadable) 
    { 
     pfReloadable = 0; 
     return VSConstants.S_OK; 
    } 

    public int LoadDocData(string pszMkDocument) 
    { 
     return VSConstants.S_OK; 
    } 

    public int OnRegisterDocData(uint docCookie, IVsHierarchy pHierNew, uint itemidNew) 
    { 
     return VSConstants.S_OK; 
    } 

    public int ReloadDocData(uint grfFlags) 
    { 
     return VSConstants.S_OK; 
    } 

    public int RenameDocData(uint grfAttribs, IVsHierarchy pHierNew, uint itemidNew, string pszMkDocumentNew) 
    { 
     return VSConstants.S_OK; 
    } 

    public int SaveDocData(VSSAVEFLAGS dwSave, out string pbstrMkDocumentNew, out int pfSaveCanceled) 
    { 
     pbstrMkDocumentNew = null; 
     pfSaveCanceled = 0; 
     return VSConstants.S_OK; 
    } 

    public int SetUntitledDocPath(string pszDocDataPath) 
    { 
     return VSConstants.S_OK; 
    } 

    #endregion 
} 

Oczywiście, trzeba będzie wdrożyć wszystkie logiki Editor (dodać interfejsy, itd.), aby naśladować to, co się robi w próbce WinForm, jak to, co dostarczają tutaj naprawdę minimalne rzeczy do czystych celów demonstracyjnych.

UWAGA: cała ta "treść" działa tylko w Visual Studio 2010 (musisz więc upewnić się, że twój projekt odwołuje się do zestawów Visual Studio 2010, co powinno mieć miejsce, jeśli projekt rozpoczniesz od podstaw, używając Visual Studio 2010). Hostowanie edytorów WPF w Visual Studio 2008 jest możliwe przy użyciu System.Windows.Forms.Integration.ElementHost.

+0

Twoja odpowiedź lub coś podobnego może mieć również zastosowanie w tym temacie : [link] (http://stackoverflow.com/questions/3989322/can-i-create-a-visual-studio-2010-add-in-that-uses-a-wpf-display), gdzie można zarobić dodatkowe +50 nagrody. – sgnsajgon

+0

@sgnsajgon - wydaje mi się duplikatem. Powinieneś usunąć nagrodę do powiązanej, abyśmy mogli oznaczyć ją jako duplikat tego (jeśli jest) –

2

Nie jestem pewien, czy powyższe jest możliwe, ale szybkie wyszukiwanie zjawił się ten: http://karlshifflett.wordpress.com/2010/03/21/visual-studio-2010-xaml-editor-intellisense-presenter-extension/

a to:

http://blogs.msdn.com/b/visualstudio/archive/2009/12/09/building-and-publishing-an-extension-for-visual-studio-2010.aspx

W przeciwnym razie, można nie gospodarzem WPF kontrolować wewnątrz kontroli WinForm przy użyciu ElementHost? Znam jego lame obejście, ale mogę pozwolić ci rozwinąć się w twoim ulubionym toolkit podczas gdy znajdziesz bardziej trwałe rozwiązanie.

poważaniem,

1

Istnieje przykładowy kod źródłowy aplikacji pakietu rozszerzeń VS w witrynie MSDN: Designer View Over XML Editor.

Opis ze strony:
This Sample demonstrates how to create an extension with a WPF-based Visual Designer for editing XML files with a specific schema (XSD) in coordination with the Visual Studio XML Editor.

rozwiązanie Prawdą jest dedykowany dla VS2010 Pakiet rozszerzający, jednak to może być po prostu przeliczone i dostosowane do formatu VS2012 - platforma docelowa powinna być zmiana do .NET 4.5, następnie niektóre odniesienia do Zespoły VS2012 (v.11.0) powinny być dodane do budowania i uruchamiania prowadzony projekt:

Microsoft.VisualStudio.Shell.11.0.dll
Microsoft.VisualStudio.Shell.Immutable.11.0.dll
Microsoft.VisualStudio.Shell.Interop.11.0

W przypadku problemów należy odwiedzić dział Q & A.

Powiązane problemy