Xamarin 窗体 DisplayAlert 按钮 TextColor
Posted
技术标签:
【中文标题】Xamarin 窗体 DisplayAlert 按钮 TextColor【英文标题】:Xamarin Forms DisplayAlert Button TextColor 【发布时间】:2015-09-06 21:13:15 【问题描述】:如何更改 Xamarin Forms DisplayAlert 对话框上的按钮文本颜色?
【问题讨论】:
【参考方案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;
【讨论】:
以上是关于Xamarin 窗体 DisplayAlert 按钮 TextColor的主要内容,如果未能解决你的问题,请参考以下文章
DisplayAlert 仅在 Xamarin 表单 ios 上不显示
当我在 Xamarin 应用程序中调用 DisplayAlert 时,屏幕变暗但不显示警报
达到条目最大长度时的 Xamarin DisplayAlert