这是我在 stackoverlow 上的第一篇文章,我认为这是 C# 和 WPF 的最佳在线帮助网站。
在过去的三天里,我研究了大约六个多小时,试图弄清楚如何将按钮处理程序事件附加到我在样式中定义的按钮。我的情况似乎与我在网上看到的所有其他示例不同。因此,我当然感谢您的意见。
MainWindow.xaml 中的一个片段,我在 Grid 中定义了以下内容
<ScrollViewer Grid.Column="2" Grid.ColumnSpan="2"
HorizontalScrollBarVisibility="Visible"
VerticalScrollBarVisibility="Hidden"
Background="AliceBlue">
<ItemsControl ItemsSource="{Binding LaserDataItems}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" Background="AliceBlue" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</ScrollViewer>
LaserDataItems 上的此绑定将包含要显示的 UserControls 列表。这些是根据需要动态创建的。但我实际上尝试在控件后面的代码中完成所有工作(下)
在向您展示 UserControl 之前,这里是我将与 UserControl 一起使用的样式。我的第一个目标是在按钮加载后创建点击事件
<Style x:Key="HeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type DataGridColumnHeader}">
<Button x:Name="MyButton" Height="20"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这是用户控件
<UserControl x:Class="EClient.Controls.GetAllLaserData"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<DataGrid Name="laserDataGrid"
ColumnHeaderStyle="{StaticResource HeaderStyle}"
AutoGenerateColumns="False"
ItemsSource="{Binding }"
IsReadOnly="True"
RowHeaderWidth="0"
Height="567"
VerticalAlignment="Top"
RowHeight="17">
<DataGrid.Columns>
<DataGridTextColumn
Width="53"
Header="{Binding HeaderName}"
Binding="{Binding Name}"></DataGridTextColumn>
</DataGrid.Columns>
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="IsEnabled" Value="False"/>
</Style>
</DataGrid.RowStyle>
</DataGrid>
</UserControl>
在这个 UserControl 的 DataGrid 中有一个 ColumnHeaderStyle,它被分配了模板:HeaderStyle。这种风格有一个按钮,我需要在实例化它时附加一个点击处理程序。我该怎么做呢。我试图通过覆盖 OnApplyTemplate 方法来访问它,但我尝试的所有内容都返回 null。此方法运行时是否可能尚未实例化按钮?一定有办法到达这个按钮。
当我运行它并成功创建这些用户控件(它们是数据网格)的列表时,可以在第一个单元格(这是每个网格的标题)中看到一个按钮。
我还尝试使用遍历可视化树的通用例程,但无济于事。其实这是我应该追求的东西,我真的很茫然。
以下作品于 2013 年 10 月 26 日添加
尽管我找到了解决此问题的另一种方法,但我仍然对解决它感兴趣。我真的认为这是一个很好的问题。
无论如何,我想我会放一张我正在尝试做的事情的照片。也许这样可以更好地看待手头的问题。