DataGrid ScrollContentPresenter不捕获RequestBringIntoView气泡事件

时间:2012-04-12 14:01:02

标签: c# .net wpf events xaml

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

0 个答案:

没有答案