我正在尝试创建一个设置网格,用户可以通过单击网格中的相应按钮将选定的设置应用到相应的行和列标题列表框。我希望我的控件的行为类似于ms当您滚动时,excel电子表格窗口就会出现。以下是我能够提出的窗口的解剖结构:
图像显示了我如何设计窗口。列表框 A 和 B 分别代表项目和用户,而ItemsControl是一个按钮网格,用作用户点击以应用他们想要的设置的单元格。相应的 A 和 B 。
我遇到的问题是,我必须能做两件事
a)当用户从左向右滚动或反之亦然 - 列表框A静止时,按钮网格和列表框B同步滚动
b)当用户滚动顶部到底部或反之亦然 - 列表框B静止时按钮网格和列表框A同步滚动
截至目前,我已将Listbox 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
答案 0 :(得分:0)
我不确定我是否完全理解这个问题,但你可以使用这种方法修改你的代码:
<StackPanel Grid.IsSharedSizeScope="True">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="col1"/>
<ColumnDefinition SharedSizeGroup="col2"/>
</Grid.ColumnDefinitions>
<TextBlock Text="some text"/>
<TextBlock Text="some other text" Grid.Column="1"/>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="col1"/>
<ColumnDefinition SharedSizeGroup="col2"/>
</Grid.ColumnDefinitions>
<TextBlock Text="text"/>
<TextBlock Text="a very very long text" Grid.Column="1"/>
</Grid>
</StackPanel>