Я удалил этот ответ, потому что я понял, что это много для этой простой задачи, но потом я решил опубликовать его в любом случае, если кто-то захочет узнать, как создать подкласс ListBoxItem по любой причине.
Чтобы действительно получить событие Click из ListBoxItem, вам нужно сделать следующее.Первый подкласс ListBoxItem и проверка MouseEnter, MouseLeave, MouseUp, MouseDown, чтобы знать, когда его запускать.
public class ClickableListBoxItem : ListBoxItem
{
// Register the routed event
public static readonly RoutedEvent ClickEvent =
EventManager.RegisterRoutedEvent( "Click", RoutingStrategy.Bubble,
typeof(RoutedEventHandler), typeof(ClickableListBoxItem));
// .NET wrapper
public event RoutedEventHandler Click
{
add
{
AddHandler(ClickEvent, value);
}
remove
{
RemoveHandler(ClickEvent, value);
}
}
protected void OnClick()
{
RaiseEvent(new RoutedEventArgs(ClickEvent));
}
private bool m_isClickable = false;
private bool m_click = false;
protected override void OnMouseEnter(System.Windows.Input.MouseEventArgs e)
{
m_isClickable = true;
base.OnMouseEnter(e);
}
protected override void OnMouseLeave(System.Windows.Input.MouseEventArgs e)
{
m_isClickable = false;
base.OnMouseLeave(e);
}
protected override void OnPreviewMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs e)
{
if (m_click == true)
{
OnClick();
}
base.OnPreviewMouseLeftButtonUp(e);
}
protected override void OnPreviewMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e)
{
if (m_isClickable == true)
{
m_click = true;
}
base.OnPreviewMouseLeftButtonDown(e);
}
}
Чтобы получить ListBox для использования ClickableListBoxItem вместо ListBoxItem, мы также должны создать подкласс ListBox и переопределить GetContainerForItemOverride.
1007 *
Затем мы можем использовать этот ClickableListBox в Xaml и получить событие Click следующим образом.Это не сработает, независимо от того, что вы поместили в ItemTemplate, Buttons, TextBoxes, TextBlocks и т. Д.
<local:ClickableListBox x:Name="c_listBox">
<local:ClickableListBox.ItemContainerStyle>
<Style TargetType="{x:Type local:ClickableListBoxItem}">
<EventSetter Event="Click" Handler="ListBoxItem_Click"/>
</Style>
</local:ClickableListBox.ItemContainerStyle>
</local:ClickableListBox>
Более простым решением было бы просто создать подкласс контейнера Parent в ItemTemplate для ListBoxItem и использовать ту же мышьподпрограммы.