Search code examples
xamarinxamarin.formspopupitalic

Xamarin.Forms - DisplayAlert with Italic font attribute


I need to display an alert with some part of the message in italics and the other part normal, something like this:

var title = "Title";
var body = "This part in Italic. This part normal.";
Application.Current.MainPage.DisplayAlert(title, body, "OK");

With the part that says: "This part in Italic." in italics and the other one in normal text.

Is it possible to do? If yes, how?

Thanks in advance!


Solution

  • I ended up creating a native alert controller like this:

    void PromptRichTextPopup(string title, string richMessage, string normalMessage, Action onOkCallback, Action onCancel = null) {
                var vc = UIKit.UIApplication.SharedApplication.KeyWindow.RootViewController;
                // take top presented view controller
                while (vc.PresentedViewController != null) {
                    vc = vc.PresentedViewController;
                }
    
                var alertvc = UIAlertController.Create(title, string.Empty, UIAlertControllerStyle.Alert);
                var leftAligned = new NSMutableParagraphStyle();
                leftAligned.Alignment = UITextAlignment.Left;
    
                var colorTitle = new NSAttributedString(str: title, font: UIFont.BoldSystemFontOfSize(18), foregroundColor: Xamarin.Forms.Color.FromHex("#61acad").ToUIColor());
    
                alertvc.SetValueForKey(colorTitle, new NSString("attributedTitle"));
    
                var margin = 5f;
                var height = 30f;
                var width = 256f;
    
                var container = new UIView(new CGRect(margin, margin, width, height * 4));
    
                var message = new NSMutableAttributedString(str: richMessage, font: UIFont.ItalicSystemFontOfSize(14), foregroundColor: UIColor.Black);
                message.Append(new NSMutableAttributedString(str: " " + normalMessage, font: UIFont.SystemFontOfSize(14), foregroundColor: UIColor.Black));
                var lblText = new UILabel(new CGRect(0, -(height / 2), width, height * 2)) { AttributedText = message };
                lblText.LineBreakMode = UILineBreakMode.WordWrap;
                lblText.Lines = 0;
                container.AddSubview(lblText);
    
                var cancel = new UIButton(new CGRect(0, height, width / 2, height * 2));
                cancel.SetTitle("NO", UIControlState.Normal);
                cancel.AddTarget((sender, e) => alertvc.DismissViewController(true, null), UIControlEvent.TouchUpInside);
                cancel.SetTitleColor(UIColor.Blue, UIControlState.Normal);
                if (onCancel != null) {
                    cancel.AddTarget((sender, e) => {
                        onCancel();
                    },
                    UIControlEvent.TouchUpInside);
                }
                container.AddSubview(cancel);
    
                var ok = new UIButton(new CGRect(width / 2, height, width / 2, height * 2));
                ok.SetTitle("YES", UIControlState.Normal);
                Action okAction = async () => {
                    ok.Enabled = false;
                    await uiHelper.RunBlocking(() => {
                        onOkCallback();
                    });
                    alertvc.DismissViewController(true, null);
                };
                ok.SetTitleColor(UIColor.Blue, UIControlState.Normal);
                container.AddSubview(ok);
                ok.AddTarget((sender, e) => {
                    okAction();
                }, UIControlEvent.TouchUpInside);
    
                var controller = new UIViewController();
                controller.View.AddSubview(container);
                alertvc.SetValueForKey(controller, new NSString("contentViewController"));
                vc.PresentViewController(alertvc, true, null);
            }