C# IScrollProvider的自动对等始终为空
我正在尝试实现一种方法,将datagrid的滚动条移回此示例之后的前一个位置,但此方法始终返回null,因此无法创建自动化。有人知道为什么它总是返回null吗C# IScrollProvider的自动对等始终为空,c#,wpf,silverlight,automation,scroll,C#,Wpf,Silverlight,Automation,Scroll,我正在尝试实现一种方法,将datagrid的滚动条移回此示例之后的前一个位置,但此方法始终返回null,因此无法创建自动化。有人知道为什么它总是返回null吗 public static IScrollProvider GetScrollProvider(DataGrid grid) { var p = FrameworkElementAutomationPeer.FromElement(grid) ?? FrameworkElementA
public static IScrollProvider GetScrollProvider(DataGrid grid)
{
var p = FrameworkElementAutomationPeer.FromElement(grid)
?? FrameworkElementAutomationPeer.CreatePeerForElement(grid);
return p.GetPattern(PatternInterface.Scroll) as IScrollProvider;
}
古老的历史,但至少目前的版本似乎工作列克魅力在所有情况下
//p.GetPattern(PatternInterface.Scroll) as IScrollProvider;
{System.Windows.Automation.Peers.DataGridAutomationPeer}
[System.Windows.Automation.Peers.DataGridAutomationPeer]:
{System.Windows.Automation.Peers.DataGridAutomationPeer}
HorizontallyScrollable: true
HorizontalScrollPercent: 0.0
HorizontalViewSize: 81.44329896907216
VerticallyScrollable: true
VerticalScrollPercent: 29.062733871459486
VerticalViewSize: 2.9625
古老的历史,但至少目前的版本似乎工作列克魅力在所有情况下
//p.GetPattern(PatternInterface.Scroll) as IScrollProvider;
{System.Windows.Automation.Peers.DataGridAutomationPeer}
[System.Windows.Automation.Peers.DataGridAutomationPeer]:
{System.Windows.Automation.Peers.DataGridAutomationPeer}
HorizontallyScrollable: true
HorizontalScrollPercent: 0.0
HorizontalViewSize: 81.44329896907216
VerticallyScrollable: true
VerticalScrollPercent: 29.062733871459486
VerticalViewSize: 2.9625
我知道这是一个老帖子,但如果有人带着同样的问题来到这里,(像我一样),下面是我如何解决它的: 出于某种原因,当您打开DataGrid的滚动条时,如果用户尚未滚动,它将通知最大位置为0,即使它不是。因此,我在更新前保存了最大值,并在以下情况下恢复: 首先,我创建一个类来保存这些值。它可以是变量,但类似乎更有组织性:
public class ScrollInfo
{
public double HorizontalPosition;
public double HorizontalMaximum;
public double VerticalPosition;
public double VerticalMaximum;
}
在更新ItemSource属性之前,我使用此方法保存滚动信息:
public static ScrollInfo GetScrollInfo(this DataGrid grid)
{
ScrollInfo oInfo = new ScrollInfo();
ScrollBar sbHorizontal = grid.GetScrollbar(ScrollMode.Horizontal);
oInfo.HorizontalMaximum = sbHorizontal.Maximum;
oInfo.HorizontalPosition = sbHorizontal.Value;
ScrollBar sbVertical = grid.GetScrollbar(ScrollMode.Vertical);
oInfo.VerticalMaximum = sbVertical.Maximum;
oInfo.VerticalPosition = sbVertical.Value;
return oInfo;
}
然后我调用此方法在更新后将此信息设置回网格:
public static void SetScrollPosition(this DataGrid grid, ScrollInfo info)
{
if (info.HorizontalPosition > 0)
{
ScrollBar sbHorizontal = grid.GetScrollbar(ScrollMode.Horizontal);
sbHorizontal.Maximum = info.HorizontalMaximum;
grid.Scroll(ScrollMode.Horizontal, info.HorizontalPosition);
}
if (info.VerticalPosition > 0)
{
ScrollBar sbVertical = grid.GetScrollbar(ScrollMode.Vertical);
sbVertical.Maximum = info.VerticalMaximum;
grid.Scroll(ScrollMode.Vertical, info.VerticalPosition);
}
}
我甚至创建了一个UpdateItemSource方法来简化工作:
public static void UpdateItemSource(this DataGrid grid, IEnumerable itemSource)
{
ScrollInfo oInfo = grid.GetScrollInfo();
grid.ItemsSource = itemSource;
grid.SetScrollPosition(oInfo);
}
我使用的其他方法,我想我是从发布问题的用户的同一帖子中获得的:
public static void Scroll(this DataGrid grid, ScrollMode mode, double position)
{
// Get the scrollbar and convert the position to percent.
var scrollBar = grid.GetScrollbar(mode);
double positionPct = ((position / scrollBar.Maximum) * 100);
// Scroll to a specfic percentage of the scrollbar.
grid.ScrollToPercent(mode, positionPct);
}
public static void ScrollToPercent(this DataGrid grid, ScrollMode mode, double percent)
{
// Fix the percentage.
if (percent < 0)
percent = 0;
else if (percent > 100)
percent = 100;
// Get the scroll provider.
var scrollProvider = GetScrollProvider(grid);
// Scroll.
switch (mode)
{
case ScrollMode.Vertical:
scrollProvider.SetScrollPercent( System.Windows.Automation.ScrollPatternIdentifiers.NoScroll, percent);
break;
case ScrollMode.Horizontal:
scrollProvider.SetScrollPercent(percent, System.Windows.Automation.ScrollPatternIdentifiers.NoScroll);
break;
}
}
公共静态无效滚动(此DataGrid网格,滚动模式,双位置)
{
//获取滚动条并将位置转换为百分比。
var scrollBar=grid.GetScrollbar(模式);
双位置PCT=((位置/滚动条最大值)*100);
//滚动至滚动条的特定百分比。
网格滚动百分比(模式、位置PCT);
}
公共静态无效ScrollToPercent(此DataGrid网格,ScrollMode模式,双百分比)
{
//确定百分比。
如果(百分比<0)
百分比=0;
否则,如果(百分比>100)
百分比=100;
//获取滚动提供程序。
var scrollProvider=GetScrollProvider(网格);
//滚动。
开关(模式)
{
案例滚动模式。垂直:
scrollProvider.SetScrollPercent(System.Windows.Automation.ScrollPatternIdentifiers.NoScroll,百分比);
打破
案例滚动模式。水平:
scrollProvider.SetScrollPercent(百分比,System.Windows.Automation.ScrollPatternIdentifiers.NoScroll);
打破
}
}
我知道这是一篇老文章,但如果有人(像我一样)带着同样的问题来到这里,我是如何解决的:
出于某种原因,当您打开DataGrid的滚动条时,如果用户尚未滚动,它将通知最大位置为0,即使它不是。因此,我在更新前保存了最大值,并在以下情况下恢复:
首先,我创建一个类来保存这些值。它可以是变量,但类似乎更有组织性:
public class ScrollInfo
{
public double HorizontalPosition;
public double HorizontalMaximum;
public double VerticalPosition;
public double VerticalMaximum;
}
在更新ItemSource属性之前,我使用此方法保存滚动信息:
public static ScrollInfo GetScrollInfo(this DataGrid grid)
{
ScrollInfo oInfo = new ScrollInfo();
ScrollBar sbHorizontal = grid.GetScrollbar(ScrollMode.Horizontal);
oInfo.HorizontalMaximum = sbHorizontal.Maximum;
oInfo.HorizontalPosition = sbHorizontal.Value;
ScrollBar sbVertical = grid.GetScrollbar(ScrollMode.Vertical);
oInfo.VerticalMaximum = sbVertical.Maximum;
oInfo.VerticalPosition = sbVertical.Value;
return oInfo;
}
然后我调用此方法在更新后将此信息设置回网格:
public static void SetScrollPosition(this DataGrid grid, ScrollInfo info)
{
if (info.HorizontalPosition > 0)
{
ScrollBar sbHorizontal = grid.GetScrollbar(ScrollMode.Horizontal);
sbHorizontal.Maximum = info.HorizontalMaximum;
grid.Scroll(ScrollMode.Horizontal, info.HorizontalPosition);
}
if (info.VerticalPosition > 0)
{
ScrollBar sbVertical = grid.GetScrollbar(ScrollMode.Vertical);
sbVertical.Maximum = info.VerticalMaximum;
grid.Scroll(ScrollMode.Vertical, info.VerticalPosition);
}
}
我甚至创建了一个UpdateItemSource方法来简化工作:
public static void UpdateItemSource(this DataGrid grid, IEnumerable itemSource)
{
ScrollInfo oInfo = grid.GetScrollInfo();
grid.ItemsSource = itemSource;
grid.SetScrollPosition(oInfo);
}
我使用的其他方法,我想我是从发布问题的用户的同一帖子中获得的:
public static void Scroll(this DataGrid grid, ScrollMode mode, double position)
{
// Get the scrollbar and convert the position to percent.
var scrollBar = grid.GetScrollbar(mode);
double positionPct = ((position / scrollBar.Maximum) * 100);
// Scroll to a specfic percentage of the scrollbar.
grid.ScrollToPercent(mode, positionPct);
}
public static void ScrollToPercent(this DataGrid grid, ScrollMode mode, double percent)
{
// Fix the percentage.
if (percent < 0)
percent = 0;
else if (percent > 100)
percent = 100;
// Get the scroll provider.
var scrollProvider = GetScrollProvider(grid);
// Scroll.
switch (mode)
{
case ScrollMode.Vertical:
scrollProvider.SetScrollPercent( System.Windows.Automation.ScrollPatternIdentifiers.NoScroll, percent);
break;
case ScrollMode.Horizontal:
scrollProvider.SetScrollPercent(percent, System.Windows.Automation.ScrollPatternIdentifiers.NoScroll);
break;
}
}
公共静态无效滚动(此DataGrid网格,滚动模式,双位置)
{
//获取滚动条并将位置转换为百分比。
var scrollBar=grid.GetScrollbar(模式);
双位置PCT=((位置/滚动条最大值)*100);
//滚动至滚动条的特定百分比。
网格滚动百分比(模式、位置PCT);
}
公共静态无效ScrollToPercent(此DataGrid网格,ScrollMode模式,双百分比)
{
//确定百分比。
如果(百分比<0)
百分比=0;
否则,如果(百分比>100)
百分比=100;
//获取滚动提供程序。
var scrollProvider=GetScrollProvider(网格);
//滚动。
开关(模式)
{
案例滚动模式。垂直:
scrollProvider.SetScrollPercent(System.Windows.Automation.ScrollPatternIdentifiers.NoScroll,百分比);
打破
案例滚动模式。水平:
scrollProvider.SetScrollPercent(百分比,System.Windows.Automation.ScrollPatternIdentifiers.NoScroll);
打破
}
}
您还记得您是否在这里解决了问题吗?我遇到了同样的问题:/I我从来都无法使用IScrollProvider。。。相反,我使用了一个本地变量,并使用scrool在datagrid上进行记录!你还记得你在这里解决问题了吗?我遇到了同样的问题:/I我从来都无法使用IScrollProvider。。。相反,我使用了一个本地变量,并使用scrool在datagrid上进行记录!