2010-09-30 43 views
5

Hi Tôi đang cố gắng loại bỏ trình đơn ngữ cảnh "Giới thiệu về Silverlight" gây phiền nhiễu bật lên bất cứ khi nào bạn nhấp chuột phải vào ứng dụng Silverlight. Tôi đã thêm các cách thông thường:Vô hiệu hóa nhấp chuột phải vào "Silverlight" trong hộp tổ hợp

Trong App.xaml
rootVisual.MouseRightButtonDown + = ((s, args) => args.Handled = true);

và giống nhau cho tất cả ChildWindows. Sự cố vẫn tồn tại trong tất cả các hộp kiểm "bật lên" như hộp tổ hợp và cửa sổ bật lên ngày tháng. Tôi không thể loại bỏ nó. Tôi muốn xử lý các nhấp chuột phải trong một phong cách mà tôi có thể làm cho tiềm ẩn cho toàn bộ ứng dụng. Điều này có thể không? Tôi có thể giải quyết nó một cách thông minh khác không?


Daniel

Trả lời

6

Câu trả lời là để kế thừa các combobox và làm cho một điều khiển tùy chỉnh như thế này:

public class CellaComboBox : ComboBox 
{ 
    public CellaComboBox() 
    { 
     DropDownOpened += _dropDownOpened; 
     DropDownClosed += _dropDownClosed; 
    } 

    private static void _dropDownClosed(object sender, EventArgs e) 
    { 
     HandlePopupRightClick(sender, false); 
    } 

    private static void _dropDownOpened(object sender, EventArgs e) 
    { 
     HandlePopupRightClick(sender, true); 
    } 

    private static void HandlePopupRightClick(object sender, bool hook) 
    { 
     ComboBox box = (ComboBox)sender; 
     var popup = box.GetChildElement<Popup>(); 
     if (popup != null) 
     { 
      HookPopupEvent(hook, popup); 
     } 
    } 

    static void HookPopupEvent(bool hook, Popup popup) 
    { 
     if (hook) 
     { 
      popup.MouseRightButtonDown += popup_MouseRightButtonDown; 
      popup.Child.MouseRightButtonDown += popup_MouseRightButtonDown; 
     } 
     else 
     { 
      popup.MouseRightButtonDown -= popup_MouseRightButtonDown; 
      popup.Child.MouseRightButtonDown -= popup_MouseRightButtonDown; 
     } 
    } 


    static void popup_MouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
    { 
     e.Handled = true; 
    } 

với phương pháp tiện ích mở rộng cho khung hình trông giống như này:

public static class FrameworkElementExtensions 
{ 
    public static TType GetChildElement<TType>(this DependencyObject parent) where TType : DependencyObject 
    { 
     TType result = default(TType); 

     if (parent != null) 
     { 
      result = parent as TType; 

      if (result == null) 
      { 
       for (int childIndex = 0; childIndex < VisualTreeHelper.GetChildrenCount(parent); ++childIndex) 
       { 
        var child = VisualTreeHelper.GetChild(parent, childIndex) as FrameworkElement; 
        result = GetChildElement<TType>(child) as TType; 
        if (result != null) return result; 
       } 
      } 
     } 

     return result; 
    } 
} 

Bạn cần phải xử lý các DatePicker theo cách tương tự nhưng thay vì DropDownOpened và DropDownClosed bạn sử dụng CalenderOpened và CalenderClosed

+1

Không cần tạo lớp tùy chỉnh. Một hành vi đính kèm chỉ hoạt động tốt. – SergioL

+0

+1: đây là một sửa chữa tuyệt vời. Cũng được mô tả. sử dụng trên SL AutocompleteComboBox với cùng một hiệu ứng. –

2

C# Corner nhất có một bài báo để sửa chữa các khoảng cửa sổ bật lên trên Silverlight 3:

Disable Context Menu in Silverlight 3 Application

+1

Cảm ơn bạn đã trả lời. Giải pháp này hoạt động hoàn hảo nếu bạn chạy ứng dụng trong trình duyệt. Rất tiếc, bản sửa lỗi này loại bỏ khả năng OOB cho ứng dụng và OOB là điều kiện tiên quyết từ khách hàng. –

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