1

我有一个带有一个 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。

4

0 回答 0