2011-02-06 28 views
12

Tôi cần mở menu và vì WP7 là not designed để thực hiện các tác vụ như vậy, tôi đang tìm trợ giúp của Bộ công cụ. Sau đây là mã mẫu:ContextMenu trên tap thay vì nhấn và giữ

<Border BorderThickness="3" Padding="6"> 
    <toolkit:ContextMenuService.ContextMenu> 
     <toolkit:ContextMenu> 
      <toolkit:MenuItem Header="item1" Click="Item1_Click" /> 
      <toolkit:MenuItem Header="item2" Click="Item2_Click" /> 
      <toolkit:MenuItem Header="item3" Click="Item3_Click" /> 
     </toolkit:ContextMenu> 
    </toolkit:ContextMenuService.ContextMenu> 
    <TextBlock Text="Tap" /> 
</Border> 

Bây giờ việc này hoạt động tốt miễn là người dùng nhấn và giữ hành động. Nhưng tôi không thể yêu cầu người dùng thực hiện hành động đó. Tôi cần phải hiển thị menu trên một nhấp chuột duy nhất/tap/touch/cử chỉ (bất cứ điều gì bạn muốn gọi nó). Ai đó có thể đề nghị? Nếu bạn nghĩ bộ công cụ không phải là cách tốt nhất, thì hãy đề xuất các lựa chọn thay thế bằng mã mẫu. Tôi đã thử cửa sổ bật lên nhưng điều đó không tốt hơn ứng dụng của tôi

Trả lời

14

Bạn có thể thêm GestureListener vào Border và đăng ký sự kiện Tap. Trong trình xử lý sự kiện, bạn nhận được ContextMenu cho số Border và đặt IsOpen thành true nếu không có cha mẹ hợp lý.

<Border BorderThickness="3" Padding="6"> 
    <toolkit:GestureService.GestureListener> 
     <toolkit:GestureListener Tap="GestureListener_Tap" /> 
    </toolkit:GestureService.GestureListener> 
    <toolkit:ContextMenuService.ContextMenu> 
     <toolkit:ContextMenu> 
      <toolkit:MenuItem Header="item1" Click="Item1_Click" /> 
      <toolkit:MenuItem Header="item2" Click="Item2_Click" /> 
      <toolkit:MenuItem Header="item3" Click="Item3_Click" /> 
     </toolkit:ContextMenu> 
    </toolkit:ContextMenuService.ContextMenu> 
    <TextBlock Text="Tap" /> 
</Border> 

private void GestureListener_Tap(object sender, GestureEventArgs e) 
{ 
    Border border = sender as Border; 
    ContextMenu contextMenu = ContextMenuService.GetContextMenu(border); 
    if (contextMenu.Parent == null) 
    { 
     contextMenu.IsOpen = true; 
    } 
} 
+0

Điều đó thực hiện công việc. Còn một chú ý đáng nói. Bất kỳ ý tưởng nào về cách đánh dấu tùy chọn đã chọn. Tôi muốn chỉ làm nổi bật hàng đã chọn với màu nền hàng được đặt thành màu xám hoặc một cái gì đó – Ravi

+1

@Ravi: Bạn có phải tô sáng 'MenuItem' đã chọn dựa trên một số điều kiện trước khi mở' ContextMenu' không? Có thể thử đặt tên cho 'MenuItem' và đặt' menuItem1.Background = new SolidColorBrush (Colors.Gray); 'dựa trên điều kiện –

+0

tuyệt vời ... cảm ơn ... tôi đã không thử nó trên menuitem nhưng được sử dụng ở nơi khác và hoạt động như một sự quyến rũ. – Ravi

0

Nếu bạn muốn menu ngữ cảnh cho ứng dụng của mình, thì ContextMenuContextMenuService là phương pháp tốt nhất để thực hiện vì nó là tiêu chuẩn trong suốt các ứng dụng của bên thứ ba và được cài đặt sẵn . Người dùng đã hiểu cử chỉ 'nhấn và giữ', do đó, làm việc xung quanh đó sẽ phản trực giác.

Nếu (vì lý do gì), bạn phải bắt đầu một ContextMenu từ một cú chạm duy nhất, sau đó bạn luôn có thể tùy chỉnh mã nguồn cho ContextMenu.cs từ Silverlight Toolkit để thay vì hooking sự kiện Hold nó móc sự kiện Tap.

+0

Xin chào Derek, điều đó không giúp được gì nhiều. Xem xét thực tế rằng tôi khá mới mẻ với WP7 và Silverlight, tôi đã kiểm tra mã surce nhưng không hiểu nhiều. Bạn có thể vui lòng giúp tôi trong việc thay đổi thao tác nhấn và giữ để chỉ nhấn? – Ravi

+0

Tải xuống mã nguồn cho Silverlight Toolkit, mở tệp nguồn mà tôi đã tham chiếu, thay đổi '.Hold + =' thành '.Tap + =', biên dịch lại, cập nhật tham chiếu trong projec của bạn thành assembly mới. Tôi vẫn nghi ngờ rất nhiều thay đổi hành vi mặc định là đúng cách để đi, mặc dù. –

+0

Xin chào Derek, có thể bạn đã đúng. Tôi nên đi với gợi ý của Meleak và sử dụng dịch vụ cử chỉ. Cảm ơn anyways – Ravi

Các vấn đề liên quan