2011-07-25 46 views
1

我想在用戶左鍵單擊GridView的列標題時顯示上下文菜單。這裏是我到目前爲止的代碼:WPF在左擊時顯示GridView列標題的上下文菜單

<GridView> 
    <GridViewColumn DisplayMemberBinding="{Binding}"> 
     <GridViewColumnHeader 
      Content="Customer" 
      Click="Header_Click" 
      > 
      <GridViewColumnHeader.ContextMenu> 
       <ContextMenu Name="ContextMenu"> 
        <MenuItem Header="Sort by Customer" /> 
        <MenuItem Header="Sort by Address" /> 
       </ContextMenu> 
      </GridViewColumnHeader.ContextMenu> 
     </GridViewColumnHeader> 
    </GridViewColumn> 
</GridView> 

而後面的代碼:

private void Header_Click(object sender, RoutedEventArgs e) 
{ 
    ContextMenu.IsOpen = true; 

    e.Handled = true; 
} 

注意的GridView是由有GridViewColumnHeader.ClickEvent事件偵聽器定製的ListView類託管。但是,如果在代碼隱藏的事件偵聽器上設置e.Handled,則會阻止事件向上冒泡。

我的問題是,當單擊標題時,上下文菜單快速出現在屏幕上,然後關閉。我相信標題正在失去焦點,這就是上下文菜單關閉的原因。即使將StaysOpen屬性設置爲true也不能解決問題。

另請注意,右鍵單擊列標題時,上下文菜單的行爲將正確。

因此,任何建議如何停止上下文菜單關閉?

回答

2

這裏的問題是,鼠標點擊會導致多個事件。在你的情況下,MouseDownMouseUp事件(或兩者)執行默認操作來點擊標題(我猜測排序)。我能夠重現你描述的行爲。要解決此問題,您可以註冊MouseDownMouseUp事件並觸發上下文菜單。

<GridView> 
    <GridViewColumn DisplayMemberBinding="{Binding Path=Customers}"> 
     <GridViewColumnHeader 
      Content="Customer" 
      MouseDown="GridViewColumnHeader_MouseDown" MouseUp="GridViewColumnHeader_MouseDown"> 
      <GridViewColumnHeader.ContextMenu> 
       <ContextMenu Name="TheContextMenu"> 
        <MenuItem Header="Sort by Customer" /> 
        <MenuItem Header="Sort by Address" /> 
       </ContextMenu> 
      </GridViewColumnHeader.ContextMenu> 
     </GridViewColumnHeader> 
    </GridViewColumn> 
</GridView> 

我用GridViewColumnHeader_MouseDown兩次,這可能是一個有點髒:)

private void GridViewColumnHeader_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    TheContextMenu.IsOpen = true; 
    e.Handled = true; 
} 

排序編輯:我剛剛被玩弄了一下。這似乎是MouseUp事件就足夠了。

+0

是的,非常感謝!看起來像將事件設置爲'MouseDown'(或'MouseUp')而不是'Click'就行了。 – OsQu

相關問題