none
プロパティウィンドウのプロパティとイベントを同時に表示させたい。 RRS feed

  • 質問

  • お世話になります。

    Visual Studio 2012を利用しております。

    さて、Windowsフォームの開発で、プロパティーウィンドウの「プロパティ」表示と「イベント」表示を、
    それぞれのボタンでクリックしてよく切り替えます。

    そこで、プロパティの表示とイベントの表示を並列させて表示することはできないでしょうか?

    2012年9月17日 8:48

回答

  • Addin作るとできました。ただし、XAMLデザイナでは構成が違うのでできませんでした。

    using System;
    using Extensibility;
    using EnvDTE;
    using EnvDTE80;
    using Microsoft.VisualStudio.CommandBars;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Collections.Generic;
    
    namespace SubPropertyWindow
    {
    	public class Connect : IDTExtensibility2, IDTCommandTarget
    	{
    		public Connect()
    		{
    		}
    		public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
    		{
    			_applicationObject = (DTE2)application;
    			_addInInstance = (AddIn)addInInst;
    			if(connectMode == ext_ConnectMode.ext_cm_UISetup)
    			{
    				object []contextGUIDS = new object[] { };
    				Commands2 commands = (Commands2)_applicationObject.Commands;
    				string toolsMenuName = "Tools";
    				Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];
    				CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
    				CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
    				try
    				{
    					Command command = commands.AddNamedCommand2(_addInInstance, "SubPropertyWindow", "SubPropertyWindow", "Executes the command for SubPropertyWindow", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
    					if((command != null) && (toolsPopup != null))
    					{
    						command.AddControl(toolsPopup.CommandBar, 1);
    					}
    				}
    				catch(System.ArgumentException)
    				{
    				}
    			}
    		}
    
    		public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom){}
    		public void OnAddInsUpdate(ref Array custom){}
    		public void OnStartupComplete(ref Array custom){}
    		public void OnBeginShutdown(ref Array custom){}
    
    		public void QueryStatus(string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus status, ref object commandText)
    		{
    			if(neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
    			{
    				if(commandName == "SubPropertyWindow.Connect.SubPropertyWindow")
    				{
    					status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported|vsCommandStatus.vsCommandStatusEnabled;
    					return;
    				}
    			}
    		}
    
    		public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
    		{
    			handled = false;
    			if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
    			{
    				if(commandName == "SubPropertyWindow.Connect.SubPropertyWindow")
    				{
    					handled = true;
                        if (pc == null)
                        {
                            pc = PropertyControlCreator.Connect(_applicationObject, _addInInstance);
                        }
    					return;
    				}
    			}
    		}
            private PropertyControl pc;
    		private DTE2 _applicationObject;
    		private AddIn _addInInstance;
    	}
    
        public class PropertyControlCreator
        {
            public static PropertyControl Connect(DTE2 _applicationObject, AddIn _addInInstance)
            {
                PropertyGrid pgVS;
                pgVS = FindVSPropertyGrid(_applicationObject);
                if (pgVS == null)
                {
                    _applicationObject.ExecuteCommand("View.PropertiesWindow");
                    pgVS = FindVSPropertyGrid(_applicationObject);
                    if (pgVS == null)
                    {
                        MessageBox.Show("PropertyGrid(WinFrom)が見つからないか、非対応のバージョンです");
                        return null;
                    }
                }
    
                string guidposition = "{36219418-9F03-4957-876E-56C06DF631A9}";
                System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
    
                try
                {
                    object o = null;
                    var window2 = (EnvDTE80.Windows2)_applicationObject.Windows;
                    var wnd = window2.CreateToolWindow2(_addInInstance, asm.Location, typeof(PropertyControl).FullName, "Property2", guidposition, ref o);
                    wnd.Visible = true;
                    wnd.IsFloating = true;
    
                    PropertyControl uc = o as PropertyControl;
                    if (uc != null)
                    {
                        uc.subPropertyGrid.SelectedObject = pgVS.SelectedObject;
                        pgVS.SelectedObjectsChanged += uc.pgVS_SelectedObjectsChanged;
                        return uc;
                    }
                    return null;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return null;
                }
            }
    
            private static PropertyGrid FindVSPropertyGrid(DTE2 _applicationObject)
            {
                PropertyGrid pgVS;
                IntPtr hwnd = new IntPtr(_applicationObject.MainWindow.HWnd);
                List<IntPtr> list = API.GetChildWindows(hwnd);
                foreach (IntPtr h in list)
                {
                    Control ctl;
                    ctl = Control.FromHandle(h);
                    if (ctl != null)
                    {
                        pgVS = ctl as PropertyGrid;
                        if (pgVS != null)
                        {
                            return pgVS;
                        }
                    }
                }
                return null;
            }
    
            internal sealed class VS : IWin32Window
            {
                public VS(IntPtr hwnd)
                {
                    this._Handle = hwnd;
                }
                private IntPtr _Handle;
                public IntPtr Handle
                {
                    get { return _Handle; }
                }
            }
    
            internal sealed class API
            {
                private API() { }
    
                private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
    
                [DllImport("user32.dll")]
                [return: MarshalAs(UnmanagedType.Bool)]
                private static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
    
                private List<IntPtr> list = new List<IntPtr>();
    
                private bool EnumWindow(IntPtr hWnd, IntPtr lParam)
                {
                    list.Add(hWnd);
                    return true;
                }
    
                public static List<IntPtr> GetChildWindows(IntPtr parentHWND)
                {
                    API api = new API();
                    EnumChildWindows(parentHWND, api.EnumWindow, IntPtr.Zero);
                    return api.list;
                }
            }
        }
    
        public partial class PropertyControl : UserControl
        {
            public PropertyControl()
            {
                subPropertyGrid = new PropertyGrid();
                subPropertyGrid.Dock = DockStyle.Fill;
                this.Controls.Add(subPropertyGrid);
            }
            internal PropertyGrid subPropertyGrid;
    
            internal void pgVS_SelectedObjectsChanged(object sender, EventArgs e)
            {
                var pgVS = sender as PropertyGrid;
                if (pgVS != null)
                {
                    try
                    {
                        this.subPropertyGrid.SelectedObject = pgVS.SelectedObject;
                    }
                    catch (Exception ex)
                    {
                        this.subPropertyGrid.SelectedObject = null;
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }
    }

    #コードが長すぎるのでコメントは抜いてあります。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 佐伯玲 2012年9月21日 7:20
    • 回答としてマーク 佐伯玲 2012年9月24日 6:37
    2012年9月18日 14:28

すべての返信

  • Addin作るとできました。ただし、XAMLデザイナでは構成が違うのでできませんでした。

    using System;
    using Extensibility;
    using EnvDTE;
    using EnvDTE80;
    using Microsoft.VisualStudio.CommandBars;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.Collections.Generic;
    
    namespace SubPropertyWindow
    {
    	public class Connect : IDTExtensibility2, IDTCommandTarget
    	{
    		public Connect()
    		{
    		}
    		public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
    		{
    			_applicationObject = (DTE2)application;
    			_addInInstance = (AddIn)addInInst;
    			if(connectMode == ext_ConnectMode.ext_cm_UISetup)
    			{
    				object []contextGUIDS = new object[] { };
    				Commands2 commands = (Commands2)_applicationObject.Commands;
    				string toolsMenuName = "Tools";
    				Microsoft.VisualStudio.CommandBars.CommandBar menuBarCommandBar = ((Microsoft.VisualStudio.CommandBars.CommandBars)_applicationObject.CommandBars)["MenuBar"];
    				CommandBarControl toolsControl = menuBarCommandBar.Controls[toolsMenuName];
    				CommandBarPopup toolsPopup = (CommandBarPopup)toolsControl;
    				try
    				{
    					Command command = commands.AddNamedCommand2(_addInInstance, "SubPropertyWindow", "SubPropertyWindow", "Executes the command for SubPropertyWindow", true, 59, ref contextGUIDS, (int)vsCommandStatus.vsCommandStatusSupported+(int)vsCommandStatus.vsCommandStatusEnabled, (int)vsCommandStyle.vsCommandStylePictAndText, vsCommandControlType.vsCommandControlTypeButton);
    					if((command != null) && (toolsPopup != null))
    					{
    						command.AddControl(toolsPopup.CommandBar, 1);
    					}
    				}
    				catch(System.ArgumentException)
    				{
    				}
    			}
    		}
    
    		public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom){}
    		public void OnAddInsUpdate(ref Array custom){}
    		public void OnStartupComplete(ref Array custom){}
    		public void OnBeginShutdown(ref Array custom){}
    
    		public void QueryStatus(string commandName, vsCommandStatusTextWanted neededText, ref vsCommandStatus status, ref object commandText)
    		{
    			if(neededText == vsCommandStatusTextWanted.vsCommandStatusTextWantedNone)
    			{
    				if(commandName == "SubPropertyWindow.Connect.SubPropertyWindow")
    				{
    					status = (vsCommandStatus)vsCommandStatus.vsCommandStatusSupported|vsCommandStatus.vsCommandStatusEnabled;
    					return;
    				}
    			}
    		}
    
    		public void Exec(string commandName, vsCommandExecOption executeOption, ref object varIn, ref object varOut, ref bool handled)
    		{
    			handled = false;
    			if(executeOption == vsCommandExecOption.vsCommandExecOptionDoDefault)
    			{
    				if(commandName == "SubPropertyWindow.Connect.SubPropertyWindow")
    				{
    					handled = true;
                        if (pc == null)
                        {
                            pc = PropertyControlCreator.Connect(_applicationObject, _addInInstance);
                        }
    					return;
    				}
    			}
    		}
            private PropertyControl pc;
    		private DTE2 _applicationObject;
    		private AddIn _addInInstance;
    	}
    
        public class PropertyControlCreator
        {
            public static PropertyControl Connect(DTE2 _applicationObject, AddIn _addInInstance)
            {
                PropertyGrid pgVS;
                pgVS = FindVSPropertyGrid(_applicationObject);
                if (pgVS == null)
                {
                    _applicationObject.ExecuteCommand("View.PropertiesWindow");
                    pgVS = FindVSPropertyGrid(_applicationObject);
                    if (pgVS == null)
                    {
                        MessageBox.Show("PropertyGrid(WinFrom)が見つからないか、非対応のバージョンです");
                        return null;
                    }
                }
    
                string guidposition = "{36219418-9F03-4957-876E-56C06DF631A9}";
                System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();
    
                try
                {
                    object o = null;
                    var window2 = (EnvDTE80.Windows2)_applicationObject.Windows;
                    var wnd = window2.CreateToolWindow2(_addInInstance, asm.Location, typeof(PropertyControl).FullName, "Property2", guidposition, ref o);
                    wnd.Visible = true;
                    wnd.IsFloating = true;
    
                    PropertyControl uc = o as PropertyControl;
                    if (uc != null)
                    {
                        uc.subPropertyGrid.SelectedObject = pgVS.SelectedObject;
                        pgVS.SelectedObjectsChanged += uc.pgVS_SelectedObjectsChanged;
                        return uc;
                    }
                    return null;
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return null;
                }
            }
    
            private static PropertyGrid FindVSPropertyGrid(DTE2 _applicationObject)
            {
                PropertyGrid pgVS;
                IntPtr hwnd = new IntPtr(_applicationObject.MainWindow.HWnd);
                List<IntPtr> list = API.GetChildWindows(hwnd);
                foreach (IntPtr h in list)
                {
                    Control ctl;
                    ctl = Control.FromHandle(h);
                    if (ctl != null)
                    {
                        pgVS = ctl as PropertyGrid;
                        if (pgVS != null)
                        {
                            return pgVS;
                        }
                    }
                }
                return null;
            }
    
            internal sealed class VS : IWin32Window
            {
                public VS(IntPtr hwnd)
                {
                    this._Handle = hwnd;
                }
                private IntPtr _Handle;
                public IntPtr Handle
                {
                    get { return _Handle; }
                }
            }
    
            internal sealed class API
            {
                private API() { }
    
                private delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
    
                [DllImport("user32.dll")]
                [return: MarshalAs(UnmanagedType.Bool)]
                private static extern bool EnumChildWindows(IntPtr hwndParent, EnumWindowsProc lpEnumFunc, IntPtr lParam);
    
                private List<IntPtr> list = new List<IntPtr>();
    
                private bool EnumWindow(IntPtr hWnd, IntPtr lParam)
                {
                    list.Add(hWnd);
                    return true;
                }
    
                public static List<IntPtr> GetChildWindows(IntPtr parentHWND)
                {
                    API api = new API();
                    EnumChildWindows(parentHWND, api.EnumWindow, IntPtr.Zero);
                    return api.list;
                }
            }
        }
    
        public partial class PropertyControl : UserControl
        {
            public PropertyControl()
            {
                subPropertyGrid = new PropertyGrid();
                subPropertyGrid.Dock = DockStyle.Fill;
                this.Controls.Add(subPropertyGrid);
            }
            internal PropertyGrid subPropertyGrid;
    
            internal void pgVS_SelectedObjectsChanged(object sender, EventArgs e)
            {
                var pgVS = sender as PropertyGrid;
                if (pgVS != null)
                {
                    try
                    {
                        this.subPropertyGrid.SelectedObject = pgVS.SelectedObject;
                    }
                    catch (Exception ex)
                    {
                        this.subPropertyGrid.SelectedObject = null;
                        MessageBox.Show(ex.Message);
                    }
                }
            }
        }
    }

    #コードが長すぎるのでコメントは抜いてあります。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答の候補に設定 佐伯玲 2012年9月21日 7:20
    • 回答としてマーク 佐伯玲 2012年9月24日 6:37
    2012年9月18日 14:28
  • こんにちは、あくあれっど さん
    フォーラムオペレータの佐伯 玲 です。

    gekka さんの返信内容をお試しいただけたでしょうか?

    質問に対して参考になる回答と思われましたので
    勝手ながら私のほうで「回答としてマーク」をさせて頂きました。

    今後ともMSDNフォーラムを宜しくお願い致します。
    __________________________
    日本マイクロソフト株式会社 フォーラム オペレーター 佐伯 玲

    2012年9月24日 6:37