C# DataGrid ScrollContentPresenter不';t捕获请求BringInToView气泡事件
我有一个带有一个数据网格的窗口。 此DataGrid的DataGridColumnHeader已模板化:C# DataGrid ScrollContentPresenter不';t捕获请求BringInToView气泡事件,c#,.net,wpf,events,xaml,C#,.net,Wpf,Events,Xaml,我有一个带有一个数据网格的窗口。 此DataGrid的DataGridColumnHeader已模板化: <Style x:Key="headerTxtBox" TargetType="{x:Type DataGridColumnHeader}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate Target
<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;
}
}
private void-gridonload(对象发送方,RoutedEventArgs RoutedEventArgs)
{
ScrollContentPresenter scp=Utils.FindDescentant(_网格);
如果(scp!=null)
{
scp.RequestBringIntoView+=ScpOnRequestBringIntoView;
}
}
问题:如果我的模板包含ScrollViewer控件(例如TextBox),ScrollContentPresenter将永远不会捕获RequestBrintIntoView事件 如果我改变我的模板,去掉ScrollViewer,一切正常。ScrollContentPresenter将捕获每个请求BringInToView
private void GridOnLoaded(object sender, RoutedEventArgs routedEventArgs)
{
ScrollContentPresenter scp = Utils.FindDescendant<ScrollContentPresenter>(_grid);
if (scp != null)
{
scp.RequestBringIntoView += ScpOnRequestBringIntoView;
}
}
当RequestBringIntoView提出时,我已经查看了路线。在这两种情况下,路线都相同。它通过ScrollContentPresenter。但在第一种情况下,RequestBringIntoView由ScrollContentPresenter的父ScrollViewer处理,而不是由ScrollContentPresenter处理。问题得到解决。谢谢,问题是我注意力不集中。任何带有ScrollViewer的控件都将包含ScrollContentPresenter。在我的例子中,模板控件也与ScrollContentPresenter一起使用。当我使用FindDescentant方法时,我从WpfTree的顶部到底部。当然,第一个ScrollContentPresenter来自TemplatedControl,而不是DataGridColumnHeader。在我的解决方案中,我寻找DataGridRowsPresenter而不是ScrollContentPresenter,并订阅他的RequestBringIntoView事件。这足够满足我的需要了。