2010-07-13 81 views
1

我將PreviewMouseLoeftButtonDown事件處理程序附加到ListBox。目標是從事件處理程序中的「e.Source」參數獲取單擊的ListBoxItem。這與下面的UI代碼工作完美:ListBox PreviewMouseLeftButtonDown DataTemplate問題

</ListBox> 
    <ListBox Name="listBox3"> 
    <ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel Orientation="Horizontal"></StackPanel> 
    </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <ListBoxItem> 
    <Rectangle Height="25" Width="30"> 
    </ListBoxItem> 
</ListBox> 

代碼:

listBox3.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(PreviewMouseLeftButtonDown); 
private void PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {} 

在執行時, 「e.Source」 填充了我點擊了ListBoxItem中。這就是我想要發生的事情。

但是下面的代碼行爲不一樣。

<ListBox Name="listBox3"> 
    <ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <StackPanel Orientation="Horizontal"></StackPanel> 
    </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <Rectangle Width="30" Height="25"/> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

而且

List<int> items = new List<int> {1}; 
listBox3.ItemsSource = items; 
listBox3.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(PreviewMouseLeftButtonDown); 
private void PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {} 

在這種情況下,ListBox中的矩形顯示OK。然而在這種情況下,「e.Source」填充了包含我單擊的項目的ListBox。這不是我想要的,我希望e.Source包含ListBoxItem我點擊了,就像我在上面附加的第一段代碼中發生的一樣。

任何想法?

回答

0

e.OriginalSource會給ListBoxItem的

+1

有趣的是,e.OriginalSource在我發佈的第一個示例中返回一個「Border」對象,在第二個示例中返回一個「Rectangle」。從來沒有ListBoxItem。 我想這是什麼挫折我,ListBox預覽事件的MouseEventArgs值的不一致性... – Andrew 2010-07-13 14:34:07

2

在依靠SourceOriginalSourceListBoxItem,爲什麼不通過樣式設置在ListBoxItem本身的事件代替?

<ListBox.ItemContainerStyle> 
    <Style TargetType="ListBoxItem"> 
     <EventSetter Event="PreviewMouseLeftButtonDown" Handler="PreviewMouseLeftButtonDown"/> 
    </Style> 
</ListBox.ItemContainerStyle> 

這樣你將確保源始終是ListBoxItem。