我在打开属性窗口的时候 只是展示了属性窗口但是没有加载属性窗口的任何属性
但是我再次打开的时候又加载出来了 第一次打开if (mySelContainer == null) 是没有值的 就加载不出来属性
.NET 4.7.2 vs扩展插件代码 加载的时候再属性一下属性窗口进行数据加载
obj 是有值的 {{PropertyType=Enum, ID=8563a2c1-b023-4c47-846e-898d31ba2093, Name=Enum7, Label=}}
mySelItems 和obj都是有值的但是要这个节点我要点击两次才能加载出来属性值
using SelectionContainer = Microsoft.VisualStudio.Shell.SelectionContainer;
private SelectionContainer mySelContainer;
private System.Collections.ArrayList mySelItems;
private IVsWindowFrame frame = null;
private void TrackSelection()
{
if (frame == null)
{
var shell = parent.GetVsService(typeof(SVsUIShell)) as IVsUIShell;
if (shell != null)
{
var guidPropertyBrowser = new Guid(ToolWindowGuids.PropertyBrowser);
shell.FindToolWindow((uint)__VSFINDTOOLWIN.FTW_fForceCreate, ref guidPropertyBrowser, out frame);
}
}
if (frame != null)
{
frame.Show();
//手动重绘一下窗口
frame.SetProperty((int)__VSFPROPID.VSFPROPID_DocView, null);
}
mySelContainer = new SelectionContainer();
mySelItems = new System.Collections.ArrayList();
PropertyType itemProperties = CheckItem().Properties;
string itemName = CheckItem().Name;
object obj = new object();
CommonFunc comFunc = new CommonFunc();
ItemData checkItem = CheckItem();
string JosnPath = Path.Combine(CommonUrl.CommonFileTableUrl, itemName + ".Json");
switch (itemProperties)
{
case PropertyType.Enum:
{
DataTable objectProperties = new DataBaseCommon().SelectProperties((int)itemProperties);
if (objectProperties.Rows.Count > 0)
{
obj = PropertyHelper.Load(objectProperties.Rows[0]["MetaData"].ToString(), itemProperties);
obj = comFunc.returnObj(obj, checkItem, JsonObjName.JsonObjName_Enum, JosnPath);//给属性模型赋值
}
}
break;
}
//将属性添加到属性窗口
mySelItems.Add(obj);
mySelContainer.SelectedObjects = mySelItems;
}
看起来您正在处理一个问题,即您的VSIX扩展中的属性窗口在第一次点击时不加载属性,而需要第二次点击才能显示值。这可能是由各种原因引起的,以下是一些建议,可用于排查和潜在解决此问题:
确保初始化顺序正确:
确保 TrackSelection 方法在正确的顺序和正确的时间进行调用。有时,方法调用的顺序可能会影响行为。
使用 SelectionChanged 事件:
不要依赖于 frame.Show() 方法,而是应处理选择更改事件并相应地更新属性。订阅属性窗口的 SelectionChanged 事件。
csharp
Copy code
frame.PropertyChanged += OnFramePropertyChanged;
然后定义事件处理程序:
csharp
Copy code
private void OnFramePropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "SelectedObjects")
{
// 在这里更新属性
}
}
显式设置选择:
在创建 SelectionContainer 并设置 SelectedObjects 后,显式地在属性窗口中设置选择:
csharp
Copy code
var propertyBrowser = frame.GetPropertyPage() as IPropertyBrowser;
propertyBrowser?.SetSelectedObjects(mySelContainer);
确保线程安全:
确保更新 UI 元素的代码在 UI 线程上执行。如果需要,可以使用 Dispatcher.Invoke。
检查异常:
查看 Visual Studio 输出窗口或错误列表中是否有任何异常,这可能提供有关第一次单击期间可能出现的问题的信息。
审查 UI 更新逻辑:
仔细检查您的 UI 更新逻辑,确保属性窗口正确地进行更新。考虑添加日志语句以跟踪执行流程。
以最小代码进行测试:
创建一个仅包含重现问题所需的必要代码的最小示例。这有助于隔离问题,更容易识别导致属性窗口第一次单击时不加载属性的根本原因。
审查 VSIX 文档:
参考 Visual Studio 扩展性文档和有关工具窗口和属性窗口的使用最佳实践的指南,以确保您的实现符合最佳实践。
通过仔细审查和测试代码的这些方面,您应该能够确定并解决导致属性窗口在第一次单击时不加载属性的问题。
您好大佬 请问方便远程查看吗 这个代码不是很清楚