我设置了FrozenColumnCount=‘2’
,HorizontalScrollBar将在最后一列冻结后显示,但我希望滚动条正常显示。
守则:
public class MyDataGrid:DataGrid
{
protected override Size ArrangeOverride(Size arrangeBounds)
{
var scrollBar = VisualTreeHelpers.GetChildObject(this, "PART_HorizontalScrollBar") as ScrollBar;
var parentGrid = VisualTreeHelpers.FindVisualParentOfType<Grid>(scrollBar);
var size = base.ArrangeOverride(arrangeBounds);
scrollBar.Arrange(new Rect(new Point(0,0),new Size(parentGrid.RenderSize.Width,scrollBar.DesiredSize.Height)));
return size;
}
}
xaml:
<local:MyDataGrid ItemsSource="{Binding List}" Loaded="FrameworkElement_OnLoaded" >
<DataGrid.FrozenColumnCount>2</DataGrid.FrozenColumnCount>
<DataGrid.Columns>
<DataGridTextColumn Header="col1"></DataGridTextColumn>
<DataGridTextColumn Header="col2"></DataGridTextColumn>
<DataGridTextColumn Header="col3"></DataGridTextColumn>
<DataGridTextColumn Header="col4"></DataGridTextColumn>
<DataGridTextColumn Header="col5"></DataGridTextColumn>
<DataGridTextColumn Header="col6"></DataGridTextColumn>
</DataGrid.Columns>
</local:MyDataGrid>
我试着调用scrollBar.InvalidateArrange()
,但它也不起作用。当我调整窗口大小时,滚动条将显示预期。
1条答案
按热度按时间vfh0ocws1#
要修改控件的布局,通常必须覆盖默认的
ControlTemplate
。在这种情况下,必须显式地告诉水平滚动条跨越宿主Grid
的两列(冻结列和非冻结列)。以下调整基于Microsoft Docs上找到的
DataGrid
的默认Style
:DataGrid ControlTemplate示例。Style
应该类似于使用Blend或Visual Studio提取默认控件Style
时获得的样式。ControlTemplate
包含一个ScrollViewer
。为了排除冻结的列,修改了此ScrollViewer
的模板。为了实现这一点,将水平
ScrollBar
添加到定义两列的Grid
:第一个用作冻结列的占位符,第二个用于托管ScrollBar
。要实现所需的布局,只需允许滚动条跨越两列: