将点击事件分配给WPF资源字典中的按钮



我将主题文件(ResourceDictionary)保存在一个单独的项目中。我在我的ResourceDictionary中使用以下ControlTemplate结构的DataGrid:

<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="ContentTemplate">        
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding}" Margin="10 5" />
<Button x:Name="btnFilter" Content="&#xf0b0;" FontFamily="{StaticResource FontAwesome}" FontSize="16" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>

我在相关项目中使用DataGrid,我需要将单击事件分配给上面名为btnFilter的按钮,我该如何做到这一点?

像VisualTree这样的方法不能很好地工作。由于我在Datagrid中有近20列,所以我使用水平滚动,VisualTree看不到滚动隐藏的列。

我应该遵循的最佳实践是什么?

由于Button.Click是冒泡路由事件,您可以在靠近根的控件上监听它。

例如,假设您将样式命名为"HeaderStyle",它将如下所示:

<DataGrid ColumnHeaderStyle="{StaticResource HeaderStyle}"
Button.Click="Button_Click">
<DataGrid.Columns>
<DataGridTextColumn Header="HeaderText"/>
</DataGrid.Columns>
</DataGrid>

如果在该控制中有多个Button,则可以通过检查RoutedEventArgs.OriginalSource进行过滤。

private void Button_Click(object sender, RoutedEventArgs e)
{
if (e.OriginalSource is Button { Name: "btnFilter" })
{
// Handle event here.
}
}

最新更新