Как я могу иметь событие Click на ListBoxItem? - PullRequest
3 голосов
/ 11 ноября 2010

Есть ли способ, которым я могу реализовать Click на ListBoxItem? Есть MouseLeftButtonUp, но на самом деле это не то же самое, я могу щелкнуть мышью в другом месте и перетащить в другой ListBoxItem, и он все еще работает, небольшая проблема, может быть странная для пользователей,

Ответы [ 2 ]

3 голосов
/ 11 ноября 2010

Я удалил этот ответ, потому что я понял, что это много для этой простой задачи, но потом я решил опубликовать его в любом случае, если кто-то захочет узнать, как создать подкласс 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 и использовать ту же мышьподпрограммы.

2 голосов
/ 11 ноября 2010

Вы можете создать новый ControlTemplate для ListBoxItem с чем-то, что можно щелкнуть в качестве корневого элемента (например, с кнопкой), обработать событие click для этого и поместить ContentPresenter внутри «clickable»?

...