我有一个带有一个 DataGrid 的窗口。此 DataGrid 的 DataGridColumnHeader 是模板化的:
<Style x:Key="headerTxtBox" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border>
<ScrollViewer/>
</Border>
<Thumb Name="PART_LeftHeaderGripper">
...
</Thumb>
<Thumb Name="PART_RightHeaderGripper">
...
</Thumb>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
主视图:
<Window>
<Window.Resources>
...
</Window.Resources>
<DataGrid Loaded="GridOnLoaded"
ColumnHeaderStyle="{StaticResource headerTxtBox}"/>
</Window>
在 DataGrid.Loaded 事件的后端,我将处理程序添加到 ScrollContentPresenter.RequestBringIntoView。
private void GridOnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
ScrollContentPresenter scp = Utils.FindDescendant<ScrollContentPresenter>(_grid);
if (scp != null)
{
scp.RequestBringIntoView += ScpOnRequestBringIntoView;
}
}
问题:
如果我的模板包含带有 ScrollViewer(例如 TextBox)的控件,则 ScrollContentPresenter 将永远不会捕获 RequestBrintIntoView 事件。
如果我将更改我的模板并摆脱 ScrollViewer,一切正常。ScrollContentPresenter 将捕获每个 RequestBringIntoView。
当 RequestBringIntoView 提出时,我已经查看了路线。在这两种情况下,路线相同。它通过 ScrollContentPresenter。但在第一种情况下 RequestBringIntoView 由 ScrollContentPresenter 的父 ScrollViewer 处理,而不是由 ScrollContentPresenter。