2016-11-09 72 views
0

我有一個XAML列表視圖定義正是如此,隨着對「的PreviewMouseRightButtonUp」和「的PreviewMouseLeftButtonUp」事件定義的事件:我可以在XAML中控制訂單點擊事件觸發嗎?

<ListView Name="lstItems" DockPanel.Dock="Top" > 
     <ListView.ItemContainerStyle> 
       <Style TargetType="{x:Type ListViewItem}" BasedOn="{StaticResource ListViewItemStyle}"> 
        <EventSetter Event="PreviewMouseRightButtonUp" 
         Handler="OnListViewItemPreviewMouseRightButtonUp" /> 
        <EventSetter Event="PreviewMouseLeftButtonUp" 
         Handler="OnListViewItemPreviewMouseLeftButtonUp" /> 
       </Style> 
     </ListView.ItemContainerStyle> 
</ListView> 

我也有一個類的objRow,從用戶控件繼承,上面有一個按鈕:

<DockPanel LastChildFill="True"> 
    <Button Name="btnOpen" DockPanel.Dock="Left" BorderBrush="Transparent" Style="{StaticResource FolderButton}" IsTabStop="False"/> 
</DockPanel> 

最後,在ListView的代碼隱藏我打電話,我在按鈕的「單擊」事件設置事件的方法:

foreach (var obj_items in objs) 
{ 
       ObjRow item = new ObjRow(); 
       item.btnOpen.Click += new RoutedEventHandler(btnOpen_Click); 

       controls.Add(item); 
} 
lstItems.ItemsSource = controls; 

這兩起事件都如預期般發生。以前,我沒有「PreviewMouseLeftButtonUp」事件,所以左擊按鈕只會觸發「Click」事件。但是,添加該事件後,左鍵單擊該按鈕將觸發兩者 - 首先是列表視圖中的「PreviewMouseLeftButtonUp」,然後是UserControl中的「Click」。

我正在尋找一種方法來忽略「預覽」事件,當按鈕被點擊時,只觸發「點擊」事件。有沒有辦法讓這些不同的事件在一起好起來?或者我需要找到另一個地方放置「PreviewMouseLeftButtonUp」代碼?

+0

當你有什麼東西(我們不知道是什麼)與隧道鼠標點擊相關的事件相關聯的時候,有人點擊'ListView'裏面的'Button'時,你會期待什麼?你可以使用[冒泡](https://msdn.microsoft.com/en-us/library/ms742806(v = vs.110).aspx)事件,如果按鈕被點擊,你不應該得到'MouseUp'事件。 – Sinatr

+0

[一些簡短而有趣的閱讀](http://stackoverflow.com/a/1460266/3283203)與該主題相關。 '預覽'自然被稱爲第一,所以也許你會想用標準替代品替代它。 – Kilazur

+0

@Sinatr總計WPF新手,在這裏 - 這正是我需要的。沒有意識到每個「預覽」事件都對應於一個等效的非預覽事件。謝謝! –

回答

0

Some short and interesting read與該主題相關。

Preview自然會在任何實際事件發生之前調用,因此它總是會在Click之前被調用。

更換通過MouseLeftButtonUp允許您的Button.Click先行動。

此外,Button.Click將阻止點擊事件轉到MouseLeftButtonUp,這符合您的要求,但如果您真的需要它,可能會成爲問題。如果需要,請參閱this question以解決此問題。