8

XAMLを使用して独自のカスタムオブジェクトグラフを表すアプリケーションがあります。これは、WPF / Silverlightオブジェクトモデルとはかなり異なります(UIデザインには使用されません)が、オブジェクトグラフを意味のある方法で視覚化することは可能です。Visual Studioにデザイナー拡張機能を追加して特定のオブジェクトを視覚化したいのですが、このトピックに関する情報を見つけるのに苦労しています。誰かが私を正しい方向に向けることができますか?

私の主な目標は、現在のXAMLの簡単な視覚的フィードバックを得ることにあります。デザイナーがビジュアル編集をサポートする必要がある段階にはまだ達していません。興味があれば、それは産業機械をシミュレートするためのツールです。XAMLを使用してマシンのコンポーネントとその接続を定義していますが、現在、完全なシミュレーションを実行して、マシンがどのように見えるかを確認する必要があります。

4

3 に答える 3

11

ファイルを解析してコンテンツを視覚化するVisualStudio拡張機能(vsix)を作成する必要があります。VisualStudioアドインまたはVisualStudioパッケージの2つのオプションがあります(質問1139294の違いの詳細を参照してください)。前者の方が少し簡単に始められますが、後者の方がより細かく制御できるので、将来編集を考えている場合はこれをお勧めします。

Visual Studio拡張機能を作成するためのSDK、別名Visual Studio 2010SP1SDKをダウンロードすることから始めます。古い非SP1バージョンについては、ここをクリックしてください

VisualStudioパッケージの作成に精通している必要があります。Microsoftチュートリアルについては、ウォークスルー:VSPackageの作成を参照してください。チュートリアルに従うと、メニューコマンドからカスタムコンポーネントをトリガーするために必要なすべてのものが揃っているはずです。したがって、実際に必要なのは、たとえば、カスタムXAMLを解析/視覚化できる通常のWPFコンポーネントだけです。また、カスタムファイルタイプをコンポーネントに関連付ける必要もあります。このためには、ProvideEditorExtensionAttributeが必要です。

サンプルのようなものはないので、サンプルライブラリのIDEサンプルエディタを参照してください。これにより、要求しているものに近い小さなファイルエディタのカスタムファイルタイプが作成されます。ファイルエディタコンポーネントと関連するファイルタイプをエディタに置き換えれば、ほぼ完了です。

于 2012-01-31T18:13:15.163 に答える
0

必要なものの良い例については、次のhttp://code.msdn.microsoft.com/windowsdesktop/Designer-View-Over-XML-20a81f17も参照してください。

于 2013-01-22T18:34:01.337 に答える
0

ProvideXmlEditorChooserDesignerViewAttributeはあなたが探しているものですが、このように機能させるためにそれを行う必要がある方法は少し奇妙です。 https://msdn.microsoft.com/en-us/library/microsoft.visualstudio.modeling.shell.providexmleditorchooserdesignerviewattribute_properties.aspx

私はこれを自分の拡張機能で機能させました、そしてそれはとても簡単です(あなたが魔法の公式を持っていれば)。VS拡張性サンプル「EditorwithToolbox」(https://github.com/Microsoft/VSSDK-Extensibility-Samples/tree/master/Editor_With_Toolbox)から作業するには、次の手順に従います。

  1. カスタムファイル拡張子を.tbxから.xamlに変更します。これはそれほど難しいことではありません。主に、.tbxを.xamlで検索+置換し、tbx.tbxファイルをxaml.xamlに変更して、ソリューション内のすべてのファイルで検索+置換します。これにより、EditorFactoryが.xamlファイル用のエディターを提供するものとしてマークされます。
  2. EditorPackage.csを開き、ProvideEditorExtension属性とProvideEditorLogicalView属性を削除します。それらをこれらの属性に置き換えます(明らかに、スタブ文字列を実際の文字列に置き換えます)。

    [ProvideXmlEditorChooserDesignerView("UnimportantDesignerViewName", "xaml",
        LogicalViewID.Designer, 10000,
        DesignerLogicalViewEditor = typeof(EditorFactory),
        Namespace = "YourNamespace",
        MatchExtensionAndNamespace = true)]
    [ProvideXmlEditorChooserDesignerView("UnimportantDesignerViewName_Enforced", "xaml",
        LogicalViewID.Designer, 10001,
        DesignerLogicalViewEditor = typeof(EditorFactory))]
    [ProvideEditorLogicalView(typeof(EditorFactory), LogicalViewID.TextView)]
    [ProvideEditorLogicalView(typeof(EditorFactory), LogicalViewID.Code)]
    [ProvideEditorLogicalView(typeof(EditorFactory), LogicalViewID.Designer)]
    [ProvideEditorLogicalView(typeof(EditorFactory), LogicalViewID.Debugging)]
    
  3. EditorFactory.csを開き、CreateEditorInstanceメソッドを編集します。ここでは、pszMkDocument filepathパラメーターで指定された.xamlファイルを開き、それが自分のものであることを確認します(たとえば、スキーマなどを使用します)。その場合は、EditorFactory Guidを出力し、S_OKを返します。そうでない場合(たとえば、WPF .xamlファイルの場合)、Guid.Emptyを出力し、VS_E_UNSUPPORTEDFORMATを返します。

    string extension = System.IO.Path.GetExtension(pszMkDocument);
    if (extension.Equals(".xaml", StringComparison.OrdinalIgnoreCase))
    {
        using (System.Xml.XmlReader reader = System.Xml.XmlReader.Create(pszMkDocument))
        {
            reader.MoveToContent();
            if (reader.NodeType == System.Xml.XmlNodeType.Element)
            {
                if (reader.NamespaceURI.Equals("YourNamespace", StringComparison.OrdinalIgnoreCase))
                {
                    EditorPane newEditor = new EditorPane();
                    ppunkDocView = Marshal.GetIUnknownForObject(newEditor);
                    ppunkDocData = Marshal.GetIUnknownForObject(newEditor);
                    pbstrEditorCaption = "";
                    return VSConstants.S_OK;
                }
            }
        }
    }
    return VSConstants.VS_E_UNSUPPORTEDFORMAT;
    

私はAvaloniaGitHubコードリポジトリ(https://github.com/AvaloniaUI/AvaloniaVS/blob/master/src/AvaloniaVS/Infrastructure/AvaloniaPackage.cs)を介してこの魔法の属性式に出くわしたので、理解してくれた人たちに感謝しますこれを。これをVS2017コミュニティに実装したばかりで、私にとっては魅力のように機能します。同じ難解なタスクを達成しようとしてこれに遭遇した人には幸運を祈ります。=)

于 2018-08-28T04:31:14.803 に答える