Общий подход заключается в создании пользовательского элемента управления:
using System;
using System.Windows;
using System.Windows.Controls;
namespace WpfApplication2
{
[TemplatePart(Name=PartMoreButtonName, Type=typeof(Button))]
public class MyListBox : ListBox
{
private const string PartMoreButtonName = "PART_MoreButton";
private Button _moreButton;
public override void OnApplyTemplate()
{
// unhook any handlers from _moreButton to prevent a memory leak
_moreButton = GetTemplateChild(PartMoreButtonName) as Button;
// do stuff with _moreButton, register handlers, etc.
}
}
}
Обратите внимание на использование строки PART_MoreButton как в TemplatePartAttribute
, так и в переопределении OnApplyTemplate
. Этот атрибут сообщает потребителям вашего элемента управления, что вы ожидаете, что любой ControlTemplate
, который они предоставляют, должен иметь элемент управления типа Button
с именем PART_MoreButton
:
<StackPanel>
<l:MyListBox>
<l:MyListBox.Style>
<Style TargetType="ListBox">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBox">
<ScrollViewer x:Name="ScrollViewer">
<StackPanel>
<ItemsPresenter/>
<Button x:Name="PART_MoreButton" Content="More"></Button>
</StackPanel>
</ScrollViewer>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</l:MyListBox.Style>
</l:MyListBox>
</StackPanel>
Когда WPF надувает шаблон для каждого экземпляра вашего элемента управления, вызывается переопределение. В этот момент у вас будет доступ к вашей кнопке и вы сможете зарегистрировать обработчики событий и т. Д. Надеюсь, это поможет!