2016-12-22 20 views
0

ユーザーがボタンをクリックしたときにコンテキストメニューが表示されるようにカスタムレンダラーを作成しようとしています。私はAndroidとUWPで動作していますが、iOSは難しいと証明しています。ボタンをクリックするとエラーは発生しませんが、UIMenuControllerは表示されませんが、ボタンを含むビューがボタンにアクセスできないようにオーバーレイされているかのようにボタンをもう一度クリックすることはできません。私はボタンにメニューコントローラを接続しようとしました、ContextMenuViewiOS UIMenuController Xamarinフォームのカスタムレンダラー

public class ContextMenuView : View 
{ 
    public EventHandler MenuRequested; 
    public void RequestMenu(object sender) 
    { 
     if(MenuRequested != null) 
     { 
      MenuRequested(sender, EventArgs.Empty); 
     } 
    } 
} 

ContextMenuViewMain.xaml上のボタンのクリックイベントからインスタンス化される -

はここXamarinフォームが表示カスタムです。 Main.xamlは、クリックされたボタンを含むAbsoluteLayoutで構成されています。

private void ContextMenuButton_Clicked(object sender, EventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine("Click"); 
     var button = sender as Button; 
     if (_popupMenu == null) 
     { 
      _popupMenu = new ContextMenuView(); 
      Rectangle menuPosition = new Rectangle { X = button.X, Y = button.Y, Width = 50, Height = 50 }; 
      _popupMenu.Layout(((Button)sender).Bounds); 
      AbsLayout.Children.Add(_popupMenu, menuPosition); 
      _popupMenu.IsVisible = true; 
     } 
     else 
     { 
      Rectangle menuPosition = new Rectangle { X = button.X, Y = button.Y + button.Height, Width = 50, Height = 50 }; 
      _popupMenu.Layout(((Button)sender).Bounds); 
     } 
     _popupMenu.RequestMenu(sender); 
    } 

とiOSレンダラ - - 事前に

public class ContextMenuViewRendererIOS : ViewRenderer<ContextMenuView, UIView> 
{ 
    private UIView _nativeControl; 
    private ContextMenuView _xamarinControl; 
    private Xamarin.Forms.AbsoluteLayout _container; 
    private UIView _iosView; 
    private nfloat _height; 
    private nfloat _width; 

    protected override void OnElementChanged(ElementChangedEventArgs<ContextMenuView> e) 
    { 
     base.OnElementChanged(e); 
     if (Control == null) 
     { 
      if (e.NewElement != null) 
      { 
       _xamarinControl = e.NewElement; 
       _xamarinControl.MenuRequested += OnMenuRequested; 
      } 
      _height = UIScreen.MainScreen.Bounds.Height; 
      _width = UIScreen.MainScreen.Bounds.Width; 
      _nativeControl = new UIView(new CGRect(0, 0, _width, _height)); 
      SetNativeControl(_nativeControl); 

     } 
    } 

    private void OnMenuRequested(object sender, EventArgs e) 
    { 
     try 
     { 
      var _menu = UIMenuController.SharedMenuController; 
      BecomeFirstResponder(); 
      var iterm = new UIMenuItem("John", new ObjCRuntime.Selector("MenuItemAction:")); 
      _menu.MenuItems = new[] { iterm }; 
      _menu.SetTargetRect(new CGRect(10, 10, 100, 100), _nativeControl); 
      _menu.MenuVisible = true; 
     } 
     catch (Exception ex) 
     { 

      throw; 
     } 
    } 

    [Export("MenuItemAction:")] 
    private void MenuItemAction(UIMenuController controller) 
    { 
     System.Diagnostics.Debug.WriteLine("MenuItemAction"); 
    } 
} 

おかげでここでボタンのクリックイベントです。

答えて

0

カスタムレンダラーは、CanBecomeFirstResponderCanPerform(Selector action, NSObject withSender)をオーバーライドし、両方からtrueを返す必要があります。

関連する問題