【发布时间】:2014-11-20 10:13:27
【问题描述】:
我正在尝试创建一个设置网格,用户可以通过单击网格中的相应按钮将所选设置应用于相应的行和列标题列表框。我希望我的控件表现得像 ms当您滚动时,excel 电子表格窗口的行为。 下面是我能够想出的窗口的解剖结构:
图片显示了我是如何设计窗口的。列表框 A 和 B 分别代表项目和用户,而作为按钮网格的 ItemsControl 充当单元格,用户单击以将他们想要的设置应用于对应的A和B。
我的问题是,我必须能够做两件事
a) 当用户从左到右滚动或从左到右滚动时 - 列表框 A 是静止的,按钮网格和列表框 B 同步滚动
b) 当用户从上到下滚动时 - 列表框 B 是静止的,按钮网格和列表框 A 同步滚动
到目前为止,我已将列表框 A 和按钮网格放在一个常见的滚动查看器中,并且我能够实现条件 b)。但不是条件 a)。为了实现 a) 和 b) 这两个条件,我必须将 Listbox A 和按钮网格解耦并链接它们的 Scroll 属性。所以我尝试了这样的事情
ScrollViewer scrollView = null;
ScrollViewer scrollView2 = null;
void scrollView_ScrollChanged(object sender, ScrollChangedEventArgs e)
{
var newOffset = e.VerticalOffset;
if ((null != scrollView) && (null != scrollView2))
{
scrollView.ScrollToVerticalOffset(newOffset);
scrollView2.ScrollToVerticalOffset(newOffset);
}
}
private ScrollViewer getScrollbar(DependencyObject dep)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(dep); i++)
{
var child = VisualTreeHelper.GetChild(dep, i);
if ((null != child) && child is ScrollViewer)
{
return (ScrollViewer)child;
}
else
{
ScrollViewer sub = getScrollbar(child);
if (sub != null)
{
return sub;
}
}
}
return null;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
scrollView = getScrollbar(dataGrid1);
scrollView2 = getScrollbar(dataGrid2);
if (null != scrollView)
{
scrollView.ScrollChanged += new ScrollChangedEventHandler(scrollView_ScrollChanged);
}
if (null != scrollView2)
{
scrollView2.ScrollChanged += new ScrollChangedEventHandler(scrollView_ScrollChanged);
}
}
我当然修改了代码以满足我的需要,但是当我解耦 Listbox A 和按钮网格时,它们不再相互对齐,并且当我滚动按钮网格(或滚动查看器)时) 列表框 A 和 B 不会同步滚动,它们的滚动幅度比滚动查看器快。
总之,我需要创建一个控件,用户可以通过在按钮网格中选择相应的按钮,将选定的设置分配给列表框 A 和 B 中的项目。列表框 A 和 B 必须与按钮网格中相应的设置按钮完全对齐。我想让用户执行滚动操作 a) 和 b),如上所述。我需要有关此问题的帮助/提示。
P.S:滚动同步代码来自stackoverflow question,按钮网格创意来自here
【问题讨论】:
标签: wpf listbox grid custom-controls