2010-11-11 2 views
3

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

+0

Это ответ на этот вопрос: http://stackoverflow.com/a/821609/58768 –

ответ

2

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

+0

Я думаю, это 1 решение, я просто подожду, чтобы увидеть, есть ли другие решения, иначе это будет отмечено как ответ –

3

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

public class ClickableListBox : ListBox 
{ 
    protected override DependencyObject GetContainerForItemOverride() 
    { 
     //Use our own ListBoxItem 
     return new ClickableListBoxItem(); 
    } 
} 

Затем мы можем использовать этот ClickableListBox в Xaml и получить событие Click таким образом. Это не будет работать, не Mather, что вы положили в ItemTemplate, кнопки, 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> 

Простейшее решение было бы просто подкласс родительского контейнера в ItemTemplate для ListBoxItem и использовать одни и те же процедуры, мыши.

Смежные вопросы