зеркало из https://github.com/DeGsoft/maui-linux.git
Merge branch '3.0.0'
This commit is contained in:
Коммит
19e19e24d9
|
@ -0,0 +1,37 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<selector xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<item android:state_pressed="true" >
|
||||
<shape>
|
||||
<solid
|
||||
android:color="#ef4444" />
|
||||
<stroke
|
||||
android:width="1dp"
|
||||
android:color="#992f2f" />
|
||||
<corners
|
||||
android:radius="6dp" />
|
||||
<padding
|
||||
android:left="10dp"
|
||||
android:top="10dp"
|
||||
android:right="10dp"
|
||||
android:bottom="10dp" />
|
||||
</shape>
|
||||
</item>
|
||||
<item>
|
||||
<shape>
|
||||
<gradient
|
||||
android:startColor="#ef4444"
|
||||
android:endColor="#992f2f"
|
||||
android:angle="270" />
|
||||
<stroke
|
||||
android:width="1dp"
|
||||
android:color="#992f2f" />
|
||||
<corners
|
||||
android:radius="6dp" />
|
||||
<padding
|
||||
android:left="10dp"
|
||||
android:top="10dp"
|
||||
android:right="10dp"
|
||||
android:bottom="10dp" />
|
||||
</shape>
|
||||
</item>
|
||||
</selector>
|
|
@ -27,6 +27,9 @@
|
|||
<item name="windowActionModeOverlay">true</item>
|
||||
|
||||
<item name="android:datePickerDialogTheme">@style/AppCompatDialogStyle</item>
|
||||
|
||||
<!--Uncomment to test exceptionally red button-->
|
||||
<!--<item name="android:buttonStyle">@style/red_button_style</item>-->
|
||||
</style>
|
||||
|
||||
<style name="AppCompatDialogStyle" parent="Theme.AppCompat.Light.Dialog">
|
||||
|
@ -35,4 +38,19 @@
|
|||
|
||||
<style name="TestStyle" parent="@android:style/Theme.Holo.Light.DarkActionBar">
|
||||
</style>
|
||||
|
||||
<style name="red_button_style" >
|
||||
<item name="android:layout_width" >fill_parent</item>
|
||||
<item name="android:layout_height" >wrap_content</item>
|
||||
<item name="android:textColor" >#ffffff</item>
|
||||
<item name="android:gravity" >center</item>
|
||||
<item name="android:layout_margin" >3dp</item>
|
||||
<item name="android:textSize" >30dp</item>
|
||||
<item name="android:textStyle" >bold</item>
|
||||
<item name="android:shadowColor" >#ffffff</item>
|
||||
<item name="android:shadowDx" >1</item>
|
||||
<item name="android:shadowDy" >4</item>
|
||||
<item name="android:shadowRadius" >2</item>
|
||||
<item name="android:background" >@drawable/red_button</item>
|
||||
</style>
|
||||
</resources>
|
|
@ -200,6 +200,7 @@
|
|||
<Compile Include="ColorPicker.cs" />
|
||||
<Compile Include="StringProvider.cs" />
|
||||
<Compile Include="TestCloudService.cs" />
|
||||
<Compile Include="_1909CustomRenderer.cs" />
|
||||
<Compile Include="_38989CustomRenderer.cs" />
|
||||
<Compile Include="BrokenImageSourceHandler.cs" />
|
||||
<Compile Include="_50787CustomRenderer.cs" />
|
||||
|
@ -335,6 +336,9 @@
|
|||
<SubType>Designer</SubType>
|
||||
</AndroidResource>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<AndroidResource Include="Resources\drawable\red_button.xml" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildExtensionsPath)\Xamarin\Android\Xamarin.Android.CSharp.targets" />
|
||||
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
|
||||
<Import Project="..\packages\Xamarin.Insights.1.11.4\build\MonoAndroid10\Xamarin.Insights.targets" Condition="Exists('..\packages\Xamarin.Insights.1.11.4\build\MonoAndroid10\Xamarin.Insights.targets')" />
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
using Android.Content;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Xamarin.Forms;
|
||||
using Xamarin.Forms.ControlGallery.Android;
|
||||
using Xamarin.Forms.Platform.Android.AppCompat;
|
||||
using Xamarin.Forms.Controls.Issues;
|
||||
|
||||
[assembly: ExportRenderer(typeof(Issue1909.FlatButton), typeof(FlatButtonRenderer))]
|
||||
namespace Xamarin.Forms.ControlGallery.Android
|
||||
{
|
||||
public class FlatButtonRenderer : ButtonRenderer
|
||||
{
|
||||
public FlatButtonRenderer(Context context) : base(context)
|
||||
{
|
||||
}
|
||||
|
||||
protected override void OnElementChanged(Platform.Android.ElementChangedEventArgs<Button> e)
|
||||
{
|
||||
base.OnElementChanged(e);
|
||||
|
||||
if (this.Control != null && this.Element != null)
|
||||
{
|
||||
var nativeButton = (global::Android.Widget.Button)Control;
|
||||
nativeButton.SetShadowLayer(0, 0, 0, global::Android.Graphics.Color.Transparent);
|
||||
|
||||
nativeButton.Elevation = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
using System;
|
||||
using Xamarin.Forms.CustomAttributes;
|
||||
using Xamarin.Forms.Internals;
|
||||
|
||||
#if UITEST
|
||||
using Xamarin.UITest;
|
||||
using NUnit.Framework;
|
||||
using Xamarin.Forms.Core.UITests;
|
||||
#endif
|
||||
|
||||
namespace Xamarin.Forms.Controls.Issues
|
||||
{
|
||||
#if UITEST
|
||||
[Category(UITestCategories.Navigation)]
|
||||
#endif
|
||||
[Preserve(AllMembers = true)]
|
||||
[Issue(IssueTracker.Github, 1355, "Setting Main Page in quick succession causes crash on Android",
|
||||
PlatformAffected.Android)]
|
||||
public class Issue1355 : TestContentPage
|
||||
{
|
||||
int _runCount = 0;
|
||||
int _maxRunCount = 2;
|
||||
const string Success = "Success";
|
||||
|
||||
protected override void Init()
|
||||
{
|
||||
Appearing += OnAppearing;
|
||||
}
|
||||
|
||||
private void OnAppearing(object o, EventArgs eventArgs)
|
||||
{
|
||||
Application.Current.MainPage = CreatePage();
|
||||
}
|
||||
|
||||
ContentPage CreatePage()
|
||||
{
|
||||
var page = new ContentPage
|
||||
{
|
||||
Content = new Label { Text = Success },
|
||||
Title = $"CreatePage Iteration: {_runCount}"
|
||||
};
|
||||
|
||||
page.Appearing += (sender, args) =>
|
||||
{
|
||||
_runCount += 1;
|
||||
if (_runCount <= _maxRunCount)
|
||||
{
|
||||
Application.Current.MainPage = new NavigationPage(CreatePage());
|
||||
}
|
||||
};
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
#if UITEST
|
||||
[Test]
|
||||
public void SwitchMainPageOnAppearing()
|
||||
{
|
||||
// Without the fix, this would crash. If we're here at all, the test passed.
|
||||
RunningApp.WaitForElement(Success);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
using System;
|
||||
using Xamarin.Forms.CustomAttributes;
|
||||
using Xamarin.Forms.Internals;
|
||||
|
||||
#if UITEST
|
||||
using Xamarin.UITest;
|
||||
using NUnit.Framework;
|
||||
using Xamarin.Forms.Core.UITests;
|
||||
#endif
|
||||
|
||||
namespace Xamarin.Forms.Controls.Issues
|
||||
{
|
||||
#if UITEST
|
||||
[Category(UITestCategories.Navigation)]
|
||||
#endif
|
||||
[Preserve(AllMembers = true)]
|
||||
[Issue(IssueTracker.Github, 1355, "Setting Main Page in quick succession causes crash on Android",
|
||||
PlatformAffected.Android)]
|
||||
public class Issue1355 : TestContentPage
|
||||
{
|
||||
int _runCount = 0;
|
||||
int _maxRunCount = 2;
|
||||
const string Success = "Success";
|
||||
|
||||
protected override void Init()
|
||||
{
|
||||
Appearing += OnAppearing;
|
||||
}
|
||||
|
||||
private void OnAppearing(object o, EventArgs eventArgs)
|
||||
{
|
||||
Application.Current.MainPage = CreatePage();
|
||||
}
|
||||
|
||||
ContentPage CreatePage()
|
||||
{
|
||||
var page = new ContentPage
|
||||
{
|
||||
Content = new Label { Text = Success },
|
||||
Title = $"CreatePage Iteration: {_runCount}"
|
||||
};
|
||||
|
||||
page.Appearing += (sender, args) =>
|
||||
{
|
||||
_runCount += 1;
|
||||
if (_runCount <= _maxRunCount)
|
||||
{
|
||||
Application.Current.MainPage = new NavigationPage(CreatePage());
|
||||
}
|
||||
};
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
#if UITEST
|
||||
[Test]
|
||||
public void SwitchMainPageOnAppearing()
|
||||
{
|
||||
// Without the fix, this would crash. If we're here at all, the test passed.
|
||||
RunningApp.WaitForElement(Success);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
|
@ -1,6 +1,8 @@
|
|||
using Xamarin.Forms.CustomAttributes;
|
||||
using Xamarin.Forms.Internals;
|
||||
using System.Reflection;
|
||||
using Xamarin.Forms.PlatformConfiguration;
|
||||
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
|
||||
|
||||
#if UITEST
|
||||
using Xamarin.Forms.Core.UITests;
|
||||
|
@ -84,6 +86,14 @@ namespace Xamarin.Forms.Controls.Issues
|
|||
},
|
||||
};
|
||||
|
||||
foreach (var element in stackLayout.Descendants())
|
||||
{
|
||||
//TODO: if (element is Button button)
|
||||
var button = element as Button;
|
||||
if (button != null)
|
||||
button.On<Android>().SetUseDefaultPadding(true).SetUseDefaultShadow(true);
|
||||
}
|
||||
|
||||
Content = stackLayout;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
using Xamarin.Forms.CustomAttributes;
|
||||
using Xamarin.Forms.Internals;
|
||||
using Xamarin.Forms.PlatformConfiguration;
|
||||
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
|
||||
|
||||
#if UITEST
|
||||
using Xamarin.Forms.Core.UITests;
|
||||
using Xamarin.UITest;
|
||||
using NUnit.Framework;
|
||||
#endif
|
||||
|
||||
namespace Xamarin.Forms.Controls.Issues
|
||||
{
|
||||
[Preserve(AllMembers = true)]
|
||||
[Issue(IssueTracker.Github, 1909, "Xamarin.forms 2.5.0.280555 and android circle button issue", PlatformAffected.Android)]
|
||||
public class Issue1909 : TestContentPage
|
||||
{
|
||||
public class FlatButton : Button { }
|
||||
protected override void Init()
|
||||
{
|
||||
Button button = new Button
|
||||
{
|
||||
BackgroundColor = Color.Red,
|
||||
CornerRadius = 32,
|
||||
BorderWidth = 0,
|
||||
FontSize = 36,
|
||||
HeightRequest = 64,
|
||||
HorizontalOptions = LayoutOptions.Center,
|
||||
TextColor = Color.White,
|
||||
VerticalOptions = LayoutOptions.Center,
|
||||
WidthRequest = 64
|
||||
};
|
||||
|
||||
button.On<Android>().SetUseDefaultPadding(true).SetUseDefaultShadow(true);
|
||||
|
||||
FlatButton flatButton = new FlatButton
|
||||
{
|
||||
BackgroundColor = Color.Red,
|
||||
CornerRadius = 32,
|
||||
BorderWidth = 0,
|
||||
FontSize = 36,
|
||||
HeightRequest = 64,
|
||||
HorizontalOptions = LayoutOptions.Center,
|
||||
TextColor = Color.White,
|
||||
VerticalOptions = LayoutOptions.Center,
|
||||
WidthRequest = 64
|
||||
};
|
||||
|
||||
Content = new StackLayout
|
||||
{
|
||||
Children = {
|
||||
new Label{ Text = "The following buttons should be perfectly round. The bottom button should be larger and should not have a shadow." },
|
||||
button,
|
||||
flatButton
|
||||
}
|
||||
};
|
||||
}
|
||||
#if UITEST
|
||||
[Test]
|
||||
[Category(UITestCategories.ManualReview)]
|
||||
public void Issue1909Test()
|
||||
{
|
||||
RunningApp.Screenshot("I am at Issue 1909");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
|
@ -241,6 +241,7 @@
|
|||
<Compile Include="$(MSBuildThisFileDirectory)Issue1683.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Issue1717.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla60001.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Issue1355.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla60056.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla60122.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla59863_0.cs" />
|
||||
|
@ -408,6 +409,7 @@
|
|||
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla59925.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Issue1326.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Issue1436.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Issue1909.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)_Template.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Bugzilla42620.cs" />
|
||||
<Compile Include="$(MSBuildThisFileDirectory)Issue1028.cs" />
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
namespace Xamarin.Forms
|
||||
{
|
||||
public static class DesignMode
|
||||
{
|
||||
public static bool IsDesignModeEnabled { get; internal set; }
|
||||
}
|
||||
}
|
|
@ -5,8 +5,17 @@ namespace Xamarin.Forms.Internals
|
|||
{
|
||||
public static class ResourceLoader
|
||||
{
|
||||
static Func<AssemblyName, string, string> resourceProvider;
|
||||
|
||||
//takes a resource path, returns string content
|
||||
public static Func<AssemblyName, string, string> ResourceProvider { get; internal set; }
|
||||
public static Func<AssemblyName, string, string> ResourceProvider {
|
||||
get => resourceProvider;
|
||||
internal set {
|
||||
DesignMode.IsDesignModeEnabled = true;
|
||||
resourceProvider = value;
|
||||
}
|
||||
}
|
||||
|
||||
internal static Action<Exception> ExceptionHandler { get; set; }
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
namespace Xamarin.Forms.PlatformConfiguration.AndroidSpecific
|
||||
{
|
||||
using FormsElement = Forms.Button;
|
||||
|
||||
public static class Button
|
||||
{
|
||||
#region UseDefaultPadding
|
||||
public static readonly BindableProperty UseDefaultPaddingProperty = BindableProperty.Create("UseDefaultPadding", typeof(bool), typeof(Button), false);
|
||||
|
||||
public static bool GetUseDefaultPadding(BindableObject element)
|
||||
{
|
||||
return (bool)element.GetValue(UseDefaultPaddingProperty);
|
||||
}
|
||||
|
||||
public static void SetUseDefaultPadding(BindableObject element, bool value)
|
||||
{
|
||||
element.SetValue(UseDefaultPaddingProperty, value);
|
||||
}
|
||||
|
||||
public static bool UseDefaultPadding(this IPlatformElementConfiguration<Android, FormsElement> config)
|
||||
{
|
||||
return GetUseDefaultPadding(config.Element);
|
||||
}
|
||||
|
||||
public static IPlatformElementConfiguration<Android, FormsElement> SetUseDefaultPadding(this IPlatformElementConfiguration<Android, FormsElement> config, bool value)
|
||||
{
|
||||
SetUseDefaultPadding(config.Element, value);
|
||||
return config;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region UseDefaultShadow
|
||||
public static readonly BindableProperty UseDefaultShadowProperty = BindableProperty.Create("UseDefaultShadow", typeof(bool), typeof(Button), false);
|
||||
|
||||
public static bool GetUseDefaultShadow(BindableObject element)
|
||||
{
|
||||
return (bool)element.GetValue(UseDefaultShadowProperty);
|
||||
}
|
||||
|
||||
public static void SetUseDefaultShadow(BindableObject element, bool value)
|
||||
{
|
||||
element.SetValue(UseDefaultShadowProperty, value);
|
||||
}
|
||||
|
||||
public static bool UseDefaultShadow(this IPlatformElementConfiguration<Android, FormsElement> config)
|
||||
{
|
||||
return GetUseDefaultShadow(config.Element);
|
||||
}
|
||||
|
||||
public static IPlatformElementConfiguration<Android, FormsElement> SetUseDefaultShadow(this IPlatformElementConfiguration<Android, FormsElement> config, bool value)
|
||||
{
|
||||
SetUseDefaultShadow(config.Element, value);
|
||||
return config;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -45,6 +45,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
|||
DrawerLayout _drawerLayout;
|
||||
MasterDetailPage _masterDetailPage;
|
||||
bool _toolbarVisible;
|
||||
bool _isAttachedToWindow;
|
||||
|
||||
// The following is based on https://android.googlesource.com/platform/frameworks/support.git/+/4a7e12af4ec095c3a53bb8481d8d92f63157c3b7/v4/java/android/support/v4/app/FragmentManager.java#677
|
||||
// Must be overriden in a custom renderer to match durations in XML animation resource files
|
||||
|
@ -218,15 +219,31 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
|||
protected override void OnAttachedToWindow()
|
||||
{
|
||||
base.OnAttachedToWindow();
|
||||
|
||||
PageController.SendAppearing();
|
||||
|
||||
// If the Appearing handler changed the application's main page for some reason,
|
||||
// this page may no longer be part of the hierarchy; if so, we need to skip
|
||||
// updating the toolbar and pushing the pages to avoid crashing the app
|
||||
if (!IsAttachedToRoot())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
RegisterToolbar();
|
||||
|
||||
// If there is already stuff on the stack we need to push it
|
||||
PushCurrentPages();
|
||||
|
||||
UpdateToolbar();
|
||||
_isAttachedToWindow = true;
|
||||
}
|
||||
|
||||
protected override void OnDetachedFromWindow()
|
||||
{
|
||||
base.OnDetachedFromWindow();
|
||||
PageController.SendDisappearing();
|
||||
_isAttachedToWindow = false;
|
||||
}
|
||||
|
||||
protected override void OnElementChanged(ElementChangedEventArgs<NavigationPage> e)
|
||||
|
@ -277,10 +294,9 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
|||
navController.InsertPageBeforeRequested += OnInsertPageBeforeRequested;
|
||||
navController.RemovePageRequested += OnRemovePageRequested;
|
||||
|
||||
// If there is already stuff on the stack we need to push it
|
||||
foreach (Page page in navController.Pages)
|
||||
if (_isAttachedToWindow && IsAttachedToRoot())
|
||||
{
|
||||
PushViewAsync(page, false);
|
||||
PushCurrentPages();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -742,8 +758,6 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
|||
Context.HideKeyboard(this);
|
||||
((Platform)Element.Platform).NavAnimationInProgress = false;
|
||||
|
||||
// TransitionDuration is how long the built-in animations are, and they are "reversible" in the sense that starting another one slightly before it's done is fine
|
||||
|
||||
return tcs.Task;
|
||||
}
|
||||
|
||||
|
@ -905,6 +919,28 @@ namespace Xamarin.Forms.Platform.Android.AppCompat
|
|||
});
|
||||
}
|
||||
|
||||
void PushCurrentPages()
|
||||
{
|
||||
var navController = (INavigationPageController)Element;
|
||||
|
||||
foreach (Page page in navController.Pages)
|
||||
{
|
||||
PushViewAsync(page, false);
|
||||
}
|
||||
}
|
||||
|
||||
bool IsAttachedToRoot()
|
||||
{
|
||||
var root = (Page)Element;
|
||||
|
||||
while (!Application.IsApplicationOrNull(root.RealParent))
|
||||
{
|
||||
root = (Page)root.RealParent;
|
||||
}
|
||||
|
||||
return root.RealParent != null;
|
||||
}
|
||||
|
||||
class ClickListener : Object, IOnClickListener
|
||||
{
|
||||
readonly NavigationPage _element;
|
||||
|
|
|
@ -3,7 +3,10 @@ using System.ComponentModel;
|
|||
using Android.Content.Res;
|
||||
using Android.Graphics.Drawables;
|
||||
using Android.OS;
|
||||
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
|
||||
using Specifics = Xamarin.Forms.PlatformConfiguration.AndroidSpecific;
|
||||
using AButton = Android.Widget.Button;
|
||||
using AColor = Android.Graphics.Color;
|
||||
|
||||
namespace Xamarin.Forms.Platform.Android
|
||||
{
|
||||
|
@ -66,7 +69,21 @@ namespace Xamarin.Forms.Platform.Android
|
|||
_backgroundDrawable = new ButtonDrawable(_nativeButton.Context.ToPixels, Forms.GetColorButtonNormal(_nativeButton.Context));
|
||||
|
||||
_backgroundDrawable.Button = _button;
|
||||
_backgroundDrawable.SetPaddingTop(_nativeButton.PaddingTop);
|
||||
|
||||
var useDefaultPadding = _button.OnThisPlatform().UseDefaultPadding();
|
||||
|
||||
int paddingTop = useDefaultPadding ? _nativeButton.PaddingTop : 0;
|
||||
int paddingLeft = useDefaultPadding ? _nativeButton.PaddingLeft : 0;
|
||||
|
||||
var useDefaultShadow = _button.OnThisPlatform().UseDefaultShadow();
|
||||
|
||||
float shadowRadius = useDefaultShadow ? 2 : _nativeButton.ShadowRadius;
|
||||
float shadowDx = useDefaultShadow ? 0 : _nativeButton.ShadowDx;
|
||||
float shadowDy = useDefaultShadow ? 4 : _nativeButton.ShadowDy;
|
||||
AColor shadowColor = useDefaultShadow ? _backgroundDrawable.PressedBackgroundColor.ToAndroid() : _nativeButton.ShadowColor;
|
||||
|
||||
_backgroundDrawable.SetPadding(paddingTop, paddingLeft)
|
||||
.SetShadow(shadowDy, shadowDx, shadowColor, shadowRadius);
|
||||
|
||||
if (_drawableEnabled)
|
||||
return;
|
||||
|
@ -141,7 +158,9 @@ namespace Xamarin.Forms.Platform.Android
|
|||
if (e.PropertyName.Equals(Button.BorderColorProperty.PropertyName) ||
|
||||
e.PropertyName.Equals(Button.BorderWidthProperty.PropertyName) ||
|
||||
e.PropertyName.Equals(Button.CornerRadiusProperty.PropertyName) ||
|
||||
e.PropertyName.Equals(VisualElement.BackgroundColorProperty.PropertyName))
|
||||
e.PropertyName.Equals(VisualElement.BackgroundColorProperty.PropertyName) ||
|
||||
e.PropertyName.Equals(Specifics.Button.UseDefaultPaddingProperty.PropertyName) ||
|
||||
e.PropertyName.Equals(Specifics.Button.UseDefaultShadowProperty.PropertyName))
|
||||
{
|
||||
Reset();
|
||||
UpdateDrawable();
|
||||
|
|
|
@ -2,28 +2,39 @@ using System;
|
|||
using System.Linq;
|
||||
using Android.Graphics;
|
||||
using Android.Graphics.Drawables;
|
||||
using AColor = Android.Graphics.Color;
|
||||
|
||||
namespace Xamarin.Forms.Platform.Android
|
||||
{
|
||||
internal class ButtonDrawable : Drawable
|
||||
{
|
||||
public const int DefaultCornerRadius = 2; // Default value for Android material button.
|
||||
const int ShadowDy = 4;
|
||||
|
||||
readonly Func<double, float> _convertToPixels;
|
||||
bool _isDisposed;
|
||||
Bitmap _normalBitmap;
|
||||
bool _pressed;
|
||||
Bitmap _pressedBitmap;
|
||||
float _paddingLeft;
|
||||
float _paddingTop;
|
||||
Color _defaultColor;
|
||||
|
||||
float PaddingLeft => _convertToPixels(8) / 2f; //<dimen name="button_padding_horizontal_material">8dp</dimen>
|
||||
float PaddingTop //can change based on font, so this is not a constant
|
||||
AColor _shadowColor;
|
||||
float _shadowDx;
|
||||
float _shadowDy;
|
||||
float _shadowRadius;
|
||||
|
||||
float PaddingLeft
|
||||
{
|
||||
get { return (_paddingTop / 2f) + ShadowDy; }
|
||||
get { return (_paddingLeft / 2f); }
|
||||
set { _paddingLeft = value; }
|
||||
}
|
||||
|
||||
float PaddingTop
|
||||
{
|
||||
get { return (_paddingTop / 2f) + _shadowDy; }
|
||||
set { _paddingTop = value; }
|
||||
}
|
||||
}
|
||||
|
||||
public ButtonDrawable(Func<double, float> convertToPixels, Color defaultColor)
|
||||
{
|
||||
|
@ -64,9 +75,20 @@ namespace Xamarin.Forms.Platform.Android
|
|||
canvas.DrawBitmap(bitmap, 0, 0, new Paint());
|
||||
}
|
||||
|
||||
public void SetPaddingTop(float value)
|
||||
public ButtonDrawable SetShadow(float dy, float dx, AColor color, float radius)
|
||||
{
|
||||
_paddingTop = value;
|
||||
_shadowDx = dx;
|
||||
_shadowDy = dy;
|
||||
_shadowColor = color;
|
||||
_shadowRadius = radius;
|
||||
return this;
|
||||
}
|
||||
|
||||
public ButtonDrawable SetPadding(float top, float left)
|
||||
{
|
||||
_paddingTop = top;
|
||||
_paddingLeft = left;
|
||||
return this;
|
||||
}
|
||||
|
||||
public void Reset()
|
||||
|
@ -136,15 +158,12 @@ namespace Xamarin.Forms.Platform.Android
|
|||
|
||||
void DrawBackground(Canvas canvas, int width, int height, bool pressed)
|
||||
{
|
||||
const int shadowDx = 0;
|
||||
const int shadowRadius = 2;
|
||||
|
||||
var paint = new Paint { AntiAlias = true };
|
||||
var path = new Path();
|
||||
|
||||
float borderRadius = ConvertCornerRadiusToPixels();
|
||||
|
||||
RectF rect = new RectF(0, 0, width, height - 0);
|
||||
RectF rect = new RectF(0, 0, width, height);
|
||||
|
||||
rect.Inset(PaddingLeft, PaddingTop);
|
||||
|
||||
|
@ -152,7 +171,8 @@ namespace Xamarin.Forms.Platform.Android
|
|||
|
||||
paint.Color = pressed ? PressedBackgroundColor.ToAndroid() : BackgroundColor.ToAndroid();
|
||||
paint.SetStyle(Paint.Style.Fill);
|
||||
paint.SetShadowLayer(shadowRadius, shadowDx, ShadowDy, PressedBackgroundColor.ToAndroid());
|
||||
paint.SetShadowLayer(_shadowRadius, _shadowDx, _shadowDy, _shadowColor);
|
||||
|
||||
canvas.DrawPath(path, paint);
|
||||
}
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ namespace Xamarin.Forms.Platform.UWP
|
|||
{
|
||||
public WindowsBasePage()
|
||||
{
|
||||
if (!DesignMode.DesignModeEnabled)
|
||||
if (!Windows.ApplicationModel.DesignMode.DesignModeEnabled)
|
||||
{
|
||||
Windows.UI.Xaml.Application.Current.Suspending += OnApplicationSuspending;
|
||||
Windows.UI.Xaml.Application.Current.Resuming += OnApplicationResuming;
|
||||
|
|
|
@ -45,6 +45,7 @@ namespace Xamarin.Forms.Xaml.Internals
|
|||
get { return xamlFileProvider; }
|
||||
internal set {
|
||||
xamlFileProvider = value;
|
||||
Xamarin.Forms.DesignMode.IsDesignModeEnabled = true;
|
||||
//¯\_(ツ)_/¯ the previewer forgot to set that bool
|
||||
DoNotThrowOnExceptions = value != null;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,214 @@
|
|||
<Type Name="Button" FullName="Xamarin.Forms.PlatformConfiguration.AndroidSpecific.Button">
|
||||
<TypeSignature Language="C#" Value="public static class Button" />
|
||||
<TypeSignature Language="ILAsm" Value=".class public auto ansi abstract sealed beforefieldinit Button extends System.Object" />
|
||||
<AssemblyInfo>
|
||||
<AssemblyName>Xamarin.Forms.Core</AssemblyName>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<Base>
|
||||
<BaseTypeName>System.Object</BaseTypeName>
|
||||
</Base>
|
||||
<Interfaces />
|
||||
<Docs>
|
||||
<summary>To be added.</summary>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
<Members>
|
||||
<Member MemberName="GetUseDefaultPadding">
|
||||
<MemberSignature Language="C#" Value="public static bool GetUseDefaultPadding (Xamarin.Forms.BindableObject element);" />
|
||||
<MemberSignature Language="ILAsm" Value=".method public static hidebysig bool GetUseDefaultPadding(class Xamarin.Forms.BindableObject element) cil managed" />
|
||||
<MemberType>Method</MemberType>
|
||||
<AssemblyInfo>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<ReturnValue>
|
||||
<ReturnType>System.Boolean</ReturnType>
|
||||
</ReturnValue>
|
||||
<Parameters>
|
||||
<Parameter Name="element" Type="Xamarin.Forms.BindableObject" />
|
||||
</Parameters>
|
||||
<Docs>
|
||||
<param name="element">To be added.</param>
|
||||
<summary>To be added.</summary>
|
||||
<returns>To be added.</returns>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
</Member>
|
||||
<Member MemberName="GetUseDefaultShadow">
|
||||
<MemberSignature Language="C#" Value="public static bool GetUseDefaultShadow (Xamarin.Forms.BindableObject element);" />
|
||||
<MemberSignature Language="ILAsm" Value=".method public static hidebysig bool GetUseDefaultShadow(class Xamarin.Forms.BindableObject element) cil managed" />
|
||||
<MemberType>Method</MemberType>
|
||||
<AssemblyInfo>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<ReturnValue>
|
||||
<ReturnType>System.Boolean</ReturnType>
|
||||
</ReturnValue>
|
||||
<Parameters>
|
||||
<Parameter Name="element" Type="Xamarin.Forms.BindableObject" />
|
||||
</Parameters>
|
||||
<Docs>
|
||||
<param name="element">To be added.</param>
|
||||
<summary>To be added.</summary>
|
||||
<returns>To be added.</returns>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
</Member>
|
||||
<Member MemberName="SetUseDefaultPadding">
|
||||
<MemberSignature Language="C#" Value="public static void SetUseDefaultPadding (Xamarin.Forms.BindableObject element, bool value);" />
|
||||
<MemberSignature Language="ILAsm" Value=".method public static hidebysig void SetUseDefaultPadding(class Xamarin.Forms.BindableObject element, bool value) cil managed" />
|
||||
<MemberType>Method</MemberType>
|
||||
<AssemblyInfo>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<ReturnValue>
|
||||
<ReturnType>System.Void</ReturnType>
|
||||
</ReturnValue>
|
||||
<Parameters>
|
||||
<Parameter Name="element" Type="Xamarin.Forms.BindableObject" />
|
||||
<Parameter Name="value" Type="System.Boolean" />
|
||||
</Parameters>
|
||||
<Docs>
|
||||
<param name="element">To be added.</param>
|
||||
<param name="value">To be added.</param>
|
||||
<summary>To be added.</summary>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
</Member>
|
||||
<Member MemberName="SetUseDefaultPadding">
|
||||
<MemberSignature Language="C#" Value="public static Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button> SetUseDefaultPadding (this Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button> config, bool value);" />
|
||||
<MemberSignature Language="ILAsm" Value=".method public static hidebysig class Xamarin.Forms.IPlatformElementConfiguration`2<class Xamarin.Forms.PlatformConfiguration.Android, class Xamarin.Forms.Button> SetUseDefaultPadding(class Xamarin.Forms.IPlatformElementConfiguration`2<class Xamarin.Forms.PlatformConfiguration.Android, class Xamarin.Forms.Button> config, bool value) cil managed" />
|
||||
<MemberType>Method</MemberType>
|
||||
<AssemblyInfo>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<ReturnValue>
|
||||
<ReturnType>Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button></ReturnType>
|
||||
</ReturnValue>
|
||||
<Parameters>
|
||||
<Parameter Name="config" Type="Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button>" RefType="this" />
|
||||
<Parameter Name="value" Type="System.Boolean" />
|
||||
</Parameters>
|
||||
<Docs>
|
||||
<param name="config">To be added.</param>
|
||||
<param name="value">To be added.</param>
|
||||
<summary>To be added.</summary>
|
||||
<returns>To be added.</returns>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
</Member>
|
||||
<Member MemberName="SetUseDefaultShadow">
|
||||
<MemberSignature Language="C#" Value="public static void SetUseDefaultShadow (Xamarin.Forms.BindableObject element, bool value);" />
|
||||
<MemberSignature Language="ILAsm" Value=".method public static hidebysig void SetUseDefaultShadow(class Xamarin.Forms.BindableObject element, bool value) cil managed" />
|
||||
<MemberType>Method</MemberType>
|
||||
<AssemblyInfo>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<ReturnValue>
|
||||
<ReturnType>System.Void</ReturnType>
|
||||
</ReturnValue>
|
||||
<Parameters>
|
||||
<Parameter Name="element" Type="Xamarin.Forms.BindableObject" />
|
||||
<Parameter Name="value" Type="System.Boolean" />
|
||||
</Parameters>
|
||||
<Docs>
|
||||
<param name="element">To be added.</param>
|
||||
<param name="value">To be added.</param>
|
||||
<summary>To be added.</summary>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
</Member>
|
||||
<Member MemberName="SetUseDefaultShadow">
|
||||
<MemberSignature Language="C#" Value="public static Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button> SetUseDefaultShadow (this Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button> config, bool value);" />
|
||||
<MemberSignature Language="ILAsm" Value=".method public static hidebysig class Xamarin.Forms.IPlatformElementConfiguration`2<class Xamarin.Forms.PlatformConfiguration.Android, class Xamarin.Forms.Button> SetUseDefaultShadow(class Xamarin.Forms.IPlatformElementConfiguration`2<class Xamarin.Forms.PlatformConfiguration.Android, class Xamarin.Forms.Button> config, bool value) cil managed" />
|
||||
<MemberType>Method</MemberType>
|
||||
<AssemblyInfo>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<ReturnValue>
|
||||
<ReturnType>Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button></ReturnType>
|
||||
</ReturnValue>
|
||||
<Parameters>
|
||||
<Parameter Name="config" Type="Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button>" RefType="this" />
|
||||
<Parameter Name="value" Type="System.Boolean" />
|
||||
</Parameters>
|
||||
<Docs>
|
||||
<param name="config">To be added.</param>
|
||||
<param name="value">To be added.</param>
|
||||
<summary>To be added.</summary>
|
||||
<returns>To be added.</returns>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
</Member>
|
||||
<Member MemberName="UseDefaultPadding">
|
||||
<MemberSignature Language="C#" Value="public static bool UseDefaultPadding (this Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button> config);" />
|
||||
<MemberSignature Language="ILAsm" Value=".method public static hidebysig bool UseDefaultPadding(class Xamarin.Forms.IPlatformElementConfiguration`2<class Xamarin.Forms.PlatformConfiguration.Android, class Xamarin.Forms.Button> config) cil managed" />
|
||||
<MemberType>Method</MemberType>
|
||||
<AssemblyInfo>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<ReturnValue>
|
||||
<ReturnType>System.Boolean</ReturnType>
|
||||
</ReturnValue>
|
||||
<Parameters>
|
||||
<Parameter Name="config" Type="Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button>" RefType="this" />
|
||||
</Parameters>
|
||||
<Docs>
|
||||
<param name="config">To be added.</param>
|
||||
<summary>To be added.</summary>
|
||||
<returns>To be added.</returns>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
</Member>
|
||||
<Member MemberName="UseDefaultPaddingProperty">
|
||||
<MemberSignature Language="C#" Value="public static readonly Xamarin.Forms.BindableProperty UseDefaultPaddingProperty;" />
|
||||
<MemberSignature Language="ILAsm" Value=".field public static initonly class Xamarin.Forms.BindableProperty UseDefaultPaddingProperty" />
|
||||
<MemberType>Field</MemberType>
|
||||
<AssemblyInfo>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<ReturnValue>
|
||||
<ReturnType>Xamarin.Forms.BindableProperty</ReturnType>
|
||||
</ReturnValue>
|
||||
<Docs>
|
||||
<summary>To be added.</summary>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
</Member>
|
||||
<Member MemberName="UseDefaultShadow">
|
||||
<MemberSignature Language="C#" Value="public static bool UseDefaultShadow (this Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button> config);" />
|
||||
<MemberSignature Language="ILAsm" Value=".method public static hidebysig bool UseDefaultShadow(class Xamarin.Forms.IPlatformElementConfiguration`2<class Xamarin.Forms.PlatformConfiguration.Android, class Xamarin.Forms.Button> config) cil managed" />
|
||||
<MemberType>Method</MemberType>
|
||||
<AssemblyInfo>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<ReturnValue>
|
||||
<ReturnType>System.Boolean</ReturnType>
|
||||
</ReturnValue>
|
||||
<Parameters>
|
||||
<Parameter Name="config" Type="Xamarin.Forms.IPlatformElementConfiguration<Xamarin.Forms.PlatformConfiguration.Android,Xamarin.Forms.Button>" RefType="this" />
|
||||
</Parameters>
|
||||
<Docs>
|
||||
<param name="config">To be added.</param>
|
||||
<summary>To be added.</summary>
|
||||
<returns>To be added.</returns>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
</Member>
|
||||
<Member MemberName="UseDefaultShadowProperty">
|
||||
<MemberSignature Language="C#" Value="public static readonly Xamarin.Forms.BindableProperty UseDefaultShadowProperty;" />
|
||||
<MemberSignature Language="ILAsm" Value=".field public static initonly class Xamarin.Forms.BindableProperty UseDefaultShadowProperty" />
|
||||
<MemberType>Field</MemberType>
|
||||
<AssemblyInfo>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<ReturnValue>
|
||||
<ReturnType>Xamarin.Forms.BindableProperty</ReturnType>
|
||||
</ReturnValue>
|
||||
<Docs>
|
||||
<summary>To be added.</summary>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
</Member>
|
||||
</Members>
|
||||
</Type>
|
|
@ -0,0 +1,34 @@
|
|||
<Type Name="DesignMode" FullName="Xamarin.Forms.DesignMode">
|
||||
<TypeSignature Language="C#" Value="public static class DesignMode" />
|
||||
<TypeSignature Language="ILAsm" Value=".class public auto ansi abstract sealed beforefieldinit DesignMode extends System.Object" />
|
||||
<AssemblyInfo>
|
||||
<AssemblyName>Xamarin.Forms.Core</AssemblyName>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<Base>
|
||||
<BaseTypeName>System.Object</BaseTypeName>
|
||||
</Base>
|
||||
<Interfaces />
|
||||
<Docs>
|
||||
<summary>To be added.</summary>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
<Members>
|
||||
<Member MemberName="IsDesignModeEnabled">
|
||||
<MemberSignature Language="C#" Value="public static bool IsDesignModeEnabled { get; }" />
|
||||
<MemberSignature Language="ILAsm" Value=".property bool IsDesignModeEnabled" />
|
||||
<MemberType>Property</MemberType>
|
||||
<AssemblyInfo>
|
||||
<AssemblyVersion>2.0.0.0</AssemblyVersion>
|
||||
</AssemblyInfo>
|
||||
<ReturnValue>
|
||||
<ReturnType>System.Boolean</ReturnType>
|
||||
</ReturnValue>
|
||||
<Docs>
|
||||
<summary>To be added.</summary>
|
||||
<value>To be added.</value>
|
||||
<remarks>To be added.</remarks>
|
||||
</Docs>
|
||||
</Member>
|
||||
</Members>
|
||||
</Type>
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
Загрузка…
Ссылка в новой задаче