我的窗口上有一个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处理。