【问题标题】:PropertyGrid scroll position not changing when setPropertyGrid 滚动位置在设置时不会改变
【发布时间】:2019-02-27 21:07:53
【问题描述】:

我在 Windows 窗体应用程序中有一个 PropertyGrid。每当其SelectedObject 更改时,它会将其VerticalScroll 值重置为0。我需要它保持在原来的位置。下面的代码似乎没有做任何事情。我尝试了PerformLayout 和一堆其他解决方案,但都没有成功。有什么想法吗?

int pos = MyGrid.VerticalScroll.Value;
MyGrid.SelectedObject = SomeDifferentObject;
MyGrid.VerticalScroll.Value = pos;

【问题讨论】:

标签: c# .net windows winforms propertygrid


【解决方案1】:

VerticalScroll 属性与 PropertyGrid 类无关。它引用 VScrollBar 控件的内部属性。 Scroll 事件永远不会发生。
VScrollBarSystem.Windows.Forms.PropertyGridInternal.PropertyGridView 控件的子控件,这是一个不能直接访问的类。

无论如何你都可以得到它,将 PropertyGrid 转换为 Control 或忽略 PropertyGrid 的 Controls 属性的 Browsable(false) 属性,然后找到 VScrollBar 子级,存储当前值,然后在更改 @ 后再次设置它987654328@物业。
请注意,此新控件的属性数量可能与以前不同,滚动条将仅设置在之前的位置。
为了更准确,您可以获取设置新SelectedObject 之前和之后显示的属性数量并执行相对滚动。

在这里,我通过它的AccessibilityObject.Role找到PropertyGridView,即AccessibleRole.Table,但您也可以通过它的文本("PropertyGridView")找到它:

var vScroll = propertyGrid1.Controls.OfType<Control>()
    .Where(ctl => ctl.AccessibilityObject.Role == AccessibleRole.Table)
    .First().Controls.OfType<VScrollBar>().First();

var vScrollValue = vScroll.Value;
propertyGrid1.SelectedObject = [Some Other Object];
vScroll.Value = vScrollValue;

如果您愿意(如前所述),将滚动条重新定位在相同的相对位置,代码可能变为:

BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;

var propGrid = propertyGrid1.Controls.OfType<Control>()
    .Where(ctl => ctl.AccessibilityObject.Role == AccessibleRole.Table).First();
var totalProperties = (int)propGrid.GetType().GetField("totalProps", flags).GetValue(propGrid);

var vScroll = propGrid.Controls.OfType<VScrollBar>().FirstOrDefault();
if (vScroll != null && totalProperties > 0) {
    var vRelativeScroll = vScroll.Value / (float)totalProperties;
    propertyGrid1.SelectedObject = this.trackBar2;

    totalProperties = (int)propGrid.GetType().GetField("totalProps", flags).GetValue(propGrid);
    vScroll.Value = (int)(vRelativeScroll * totalProperties);
}

【讨论】:

  • 精美的解释和完美的工作。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 2015-06-11
  • 1970-01-01
  • 2011-04-03
相关资源
最近更新 更多