簡體   English   中英

WP8的自定義上下文菜單XAML

[英]Custom context menu XAML for WP8

我嘗試在LongListSelector實現自定義ContextMenu。

我沒有使用Microsoft.Phone.Controls.ToolkitContextMenu ,它與Rowi App中的基本上相同:


(來源: hiddenpineapple.com

方法1

我的列表項將VisualState切換為保留狀態,並顯示一個帶有控件的覆蓋圖。

問題

當用戶在列表項之外單擊時(如默認的ContextMenu一樣),我找不到返回默認狀態的方法。

方法2

我為工具箱ContextMenu實現了一個自定義模板,它看起來完全一樣。 我必須將其邊距頂部移至-itemHeight ,因為默認情況下它位於該項目下方。

問題

該解決方案的問題在於,它在打開時會自動關閉,我不知道該如何避免。
另一個問題是,它與Toolkit中的TiltEffect.IsTiltEnabled一起使用時效果TiltEffect.IsTiltEnabled (視覺問題)。

我需要你的幫助

關於如何使它工作的任何建議?


回答

多虧了Cheese ,現在我知道當用戶在外面單擊時如何正確關閉菜單。 他的建議是獲取當前頁面上Tap事件的坐標,並檢查它是否在菜單內。 否則,請關閉菜單。

因此,我在菜單打開時向頁面添加了Tap偵聽器,並在菜單關閉時將其刪除。 從頁面偵聽器中,我得到了事件坐標,並可以檢查它是否在包含菜單的控件內(大小和位置相同)。 通過添加ActualWidth和ActualHeight,我收到了Point leftUpperPoint = control.TransformToVisual(page).Transform(new Point(0, 0))rightLowerPoint的位置。

但是后來我意識到:

為什么還要計算水龍頭是否在菜單內? 我總是想在用戶點擊屏幕上的任何位置時關閉菜單。 如果在外面, 是的 如果在菜單按鈕上, 則為

我進行的另一個修改是監聽MouseLeftButtonDown而不是Tap因為它在用戶滑動時也會觸發。

所以我刪除了這段代碼,並提出了以下內容:

private void ToggleMenu(object sender, System.Windows.Input.GestureEventArgs e)
{
  PhoneApplicationFrame frame = ((PhoneApplicationFrame)Application.Current.RootVisual);
  VisualState state = this.States.CurrentState;

  if (state == null || state.Name == "DefaultState")
  {
    frame.MouseLeftButtonDown += MouseDownDelegate;
    this.State = "MenuState";
  }
  else
  {
    frame.MouseLeftButtonDown -= MouseDownDelegate;
    this.State = "DefaultState";
  }
}

private void MouseDownDelegate(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
  ToggleMenu(sender, null);
}

這樣完美!

感謝Cheese的提示。

方法1的問題

最好的解決方案是:

獲取菜單坐標,當用戶點擊時-您檢查菜單上的點擊坐標是否存在,否則查看-取消-簡單。

方法2問題

我想您在角落里有一些按鈕,當您輕按它時-什么都沒發生? 而當您解雇Tilt時,一切都奏效了。 傾斜似乎比單擊更快,因此,傾斜會更改按鈕坐標以及您錯過/或拖過的設備提示

您可以使用@ScottIsAFool的建議,還可以在UIElement類型的TapMenu控件上創建另一個名為CloseWhenTappedElement的Dependency屬性,並在設置后自動監聽控件內的Tap事件。 例如

<Grid x:Name="TapArea"/>
<TapMenu CloseWhenTappedElement="{Binding ElementName=TapArea"}/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM