【问题标题】:Xamarin Forms DisplayAlert Button TextColorXamarin 窗体 DisplayAlert 按钮 TextColor
【发布时间】:2015-09-06 21:13:15
【问题描述】:

如何更改 Xamarin Forms DisplayAlert 对话框上的按钮文本颜色?

【问题讨论】:

    标签: button xamarin.forms popupwindow textcolor


    【解决方案1】:

    可以在custom renderers 的帮助下为每个平台更改颜色。 您可以在自定义渲染器中访问本机 api。 但需要确定是需要的,因为不推荐(对于 iOS 肯定)。

    The UIAlertView class is intended to be used as-is and does not support subclassing. The view hierarchy for this class is private and must not be modified.

    iOS 相关主题here。

    【讨论】:

    • 非常有用的信息。但是,我只是看不到如何为 DisplayAlert 对话框创建自定义渲染器。我想我可以创建自己的模态对话框。
    • 你是对的。更容易为每个平台实现自定义对话框并使用 DI 解决它们。请注意:"You cannot customize the appearance of alert views."
    • 在某些情况下,我使用 Toasts 插件代替警报对话框。它有许多可能对您有用的自定义选项。 nuget.org/packages/Toasts.Forms.Plugin
    【解决方案2】:

    FWIW,我选择在 XAML 中创建一个新的 ContentPage 并使用 Navigation.PushModalAsync 显示它。就我而言,这是模拟警报并保持对所有样式的控制的最简单方法。

    XAML:

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
                 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
                 x:Class="YourNamespace.AlertPage"
                 BackgroundColor="DarkGray"
                 Padding="40">
        <ContentPage.Content>
            <StackLayout BackgroundColor="White" Padding="10">
                <Label x:Name="lblTitle" FontAttributes="Bold" FontSize="Large" Text="Title" HorizontalOptions="Center"></Label>
                <BoxView HeightRequest="1" BackgroundColor="DarkGray"></BoxView>
                <ScrollView Orientation="Vertical" VerticalOptions="FillAndExpand">
                    <Label x:Name="lblText" FontSize="Medium"></Label>
                </ScrollView>
                <BoxView HeightRequest="1" BackgroundColor="DarkGray"></BoxView>
                <StackLayout Orientation="Horizontal">
                    <Button x:Name="btn1" Text="Button 1" HorizontalOptions="CenterAndExpand"></Button>
                    <Button x:Name="btn2" Text="Button 2" HorizontalOptions="CenterAndExpand"></Button>
                </StackLayout>
            </StackLayout>
        </ContentPage.Content>
    </ContentPage>
    

    C#:

    public partial class AlertPage : ContentPage
    {
        public Label LblTitle
        {
            get
            {
                return lblTitle;
            }
        }
    
        public Label LblText
        {
            get
            {
                return lblText;
            }
        }
    
        public Button Button1
        {
            get
            {
                return btn1;
            }
        }
    
        public Button Button2
        {
            get
            {
                return btn2;
            }
        }
    
        public AlertPage()
        {
            InitializeComponent();
        }
    }
    

    实施:

    var ap = new AlertPage();
    ap.LblTitle.Text = "Instructions";
    ap.LblText.Text = "The text to display!";
    ap.Button1.Text = "Done";
    ap.Button1.Clicked += async (s, a) =>
    {
        await Navigation.PopModalAsync();
    };
    ap.Button2.IsVisible = false;
    await Navigation.PushModalAsync(ap);
    

    截图:

    【讨论】:

    • 谢谢。实现起来非常简单
    【解决方案3】:

    我已经创建了自定义显示警报,您可以使用任务回调 TaskCompletionSource 作为 xamarin build DisplayAlert from it

        public async Task<bool> ShowDialogAsync(string title, string message, string acceptMessage, string cancelMessage)
                    {
                        Grid ShowDialogMessage = null;
                        Grid CurrentPageGrid = (App.Instance.CurrentPage as ContentPage).Content as Grid;
                        TaskCompletionSource<bool> result = new TaskCompletionSource<bool>();
                        try
                        {
                            ShowDialogMessage = GenericView.CustomDisplayAlert(message, CurrentPageGrid.RowDefinitions.Count, CurrentPageGrid.ColumnDefinitions.Count, () =>
                            {
             //here you can add your implementation   
                                CurrentPageGrid.Children.Remove(ShowDialogMessage);
    
      result.SetResult(true);
    
                            },
                            () =>
                            {
             //here you can add your implementation      
                                CurrentPageGrid.Children.Remove(ShowDialogMessage);
                                result.SetResult(false);
                            }, title, acceptMessage, cancelMessage);
    
                            CurrentPageGrid.Children.Add(ShowDialogMessage);
                            return await result.Task;
                        }
                        catch (Exception ex)
                        {
                            return await App.Current.MainPage.DisplayAlert(title, message, acceptMessage, cancelMessage);
            #if DEBUG
                            throw ex;
            #endif
                        }
    
                    }
    

    在我的方法中,我添加了实现回调的操作,方法签名您可以添加自己的设计

     public static Grid CustomDisplayAlert(string message, int rows, int columns, Action acceptAction, Action cancelAction, string title = "", string acceptMessage = "", string cancelMessage = "")
            {           
                 Grid overlay = new Grid
                {
                    BackgroundColor = Color.FromRgba(0, 0, 0, 190),
                    RowDefinitions = new RowDefinitionCollection { new RowDefinition { Height = GridLength.Star }, new RowDefinition { Height = GridLength.Auto }, new RowDefinition { Height = GridLength.Star } }
                };
    
                    Grid.SetRowSpan(overlay, rows);
    
                    Grid.SetColumnSpan(overlay, columns);
    
    
                Grid bodyView = new Grid();
    
    
                StackLayout stackMainView = new StackLayout
                {
                    Margin = new Thickness(20)
                };
                StackLayout stackButtonsView = new StackLayout
                {
                    Orientation=StackOrientation.Horizontal 
                };
                RoundedBox bgOverlay = new RoundedBox
                {
                    CornerRadius = 4,
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    VerticalOptions = LayoutOptions.FillAndExpand,
                    BackgroundColor = Color.White
                };
    
                bodyView.Children.Add(bgOverlay);
    
                StackLayout elementsContainer = new StackLayout { Margin = new Thickness(10) };
    
                IconicLabel itemDescription = new IconicLabel { MoreReadable = true, Text = message, StyleId = "Myriad-Pro-L", HorizontalTextAlignment = TextAlignment.Center, HorizontalOptions = LayoutOptions.FillAndExpand, TextColor = (Color)(App.Current.Resources["OptioDark"]), FontSize = 18, Margin = new Thickness(15) };
                IconicLabel titleView = new IconicLabel { FontAttributes = FontAttributes.Bold, MoreReadable = true, Text = title, StyleId = "Myriad-Pro-L", HorizontalTextAlignment = TextAlignment.Center, HorizontalOptions = LayoutOptions.FillAndExpand, TextColor = (Color)(App.Current.Resources["OptioDark"]), FontSize = 22, Margin = new Thickness(15) };
    
                if (titleView.Text.Length != 0)
                    elementsContainer.Children.Add(titleView);
                elementsContainer.Children.Add(itemDescription);
    
    
                bodyView.Children.Add(elementsContainer);
    
                IconicButton acceptBtn = new IconicButton
                {
                    HeightRequest = 40,
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    VerticalOptions = LayoutOptions.FillAndExpand,
                    BackgroundColor = Color.White,
                    Text = acceptMessage,
                    TextColor = (Color)(App.Current.Resources["OptioDark"])
                };
                IconicButton cancelBtn = new IconicButton
                {
                    HeightRequest = 40,
                    HorizontalOptions = LayoutOptions.FillAndExpand,
                    VerticalOptions = LayoutOptions.FillAndExpand,
                    BackgroundColor = Color.White,
                    Text = cancelMessage,
                    TextColor = (Color)(App.Current.Resources["OptioDark"])
                };
                acceptBtn.Clicked += (sender, e) =>
                {
                    acceptAction?.Invoke();
                };
                cancelBtn.Clicked += (sender, e) =>
                {
                    cancelAction?.Invoke();
                };
    
                stackButtonsView.Children.Add(acceptBtn);
                stackButtonsView.Children.Add(cancelBtn);
    
                stackMainView.Children.Add(bodyView);
    
                stackMainView.Children.Add(stackButtonsView);
                overlay.Children.Add(stackMainView, 0, 1);
                return overlay;
    
            }
    

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 2015-09-26
      • 1970-01-01
      相关资源
      最近更新 更多