dotnet / maui

.NET MAUI is the .NET Multi-platform App UI, a framework for building native device applications spanning mobile, tablet, and desktop.
https://dot.net/maui
MIT License
22.24k stars 1.76k forks source link

Style applied to a wrong element throws exception in Release but not in Debug #21661

Open czmirek opened 7 months ago

czmirek commented 7 months ago

Description

Invalid XAML throws exception in Release but not in Debug. It should be thrown in both or better it should become a compilation error.

The content page below contains a Border that has a Style="{StaticResource BlackButton}".

But the BlackButton is targetted only at Buttons. This works perfectly fine in Debug but throws an exception in Release. This makes it difficult to spot when you make this mistake.

TestPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MauiReleaseXamlBug"
             x:Class="MauiReleaseXamlBug.TestPage"
             x:DataType="local:TestViewModel"
             Title="TestPage">
    <Border Style="{StaticResource BlackButton}">
    </Border>
</ContentPage>

App.xaml

<Style TargetType="Button" x:Key="BaseButton">
    <Setter Property="CornerRadius" Value="25" />
    <Setter Property="Padding" Value="20,10,20,10" />
    <Setter Property="FontSize" Value="16" />
    <Setter Property="HeightRequest" Value="48" />
</Style>

<Style TargetType="Button" x:Key="BlackButton" BasedOn="{StaticResource BaseButton}">
    <Setter Property="BackgroundColor" Value="#000000" />
    <Setter Property="TextColor" Value="#FFFFFF" />
</Style>

See log output below.

dotnet workload list

Installed Workload Id      Manifest Version       Installation Source                
-------------------------------------------------------------------------------------
maui-windows               8.0.7/8.0.100          VS 17.9.34701.34, VS 17.10.34607.79
android                    34.0.79/8.0.100        VS 17.9.34701.34, VS 17.10.34607.79
maccatalyst                17.2.8022/8.0.100      VS 17.9.34701.34, VS 17.10.34607.79
ios                        17.2.8022/8.0.100      VS 17.9.34701.34, VS 17.10.34607.79

Steps to Reproduce

Link to public reproduction project repository

https://github.com/czmirek/MauiReleaseXamlBug

Version with bug

Unknown/Other

Is this a regression from previous behavior?

Not sure, did not test other versions

Last version that worked well

Unknown/Other

Affected platforms

iOS, Android

Affected platform versions

Android 14, iOS 17 (iPhone 12)

Did you find any workaround?

Simply fix the style: make duplicate style to target the Border element or remove the style and apply it directly.

Relevant log output

System.InvalidCastException: Arg_InvalidCastException
at Microsoft.Maui.Controls.FontElement.FontSizeDefaultValueCreator(BindableObject bindable)
at Microsoft.Maui.Controls.BindableObject.SetValueCore(BindableProperty property, Object value, SetValueFlags attributes, SetValuePrivateFlags privateAttributes, SetterSpecificity specificity)
at Microsoft.Maui.Controls.BindableObject.SetValue(BindableProperty property, Object value, SetterSpecificity specificity)
at Microsoft.Maui.Controls.Setter.Apply(BindableObject target, SetterSpecificity specificity)
at Microsoft.Maui.Controls.Style.ApplyCore(BindableObject bindable, Style basedOn, SetterSpecificity specificity)
at Microsoft.Maui.Controls.Style.Microsoft.Maui.Controls.IStyle.Apply(BindableObject bindable, SetterSpecificity specificity)
at Microsoft.Maui.Controls.Style.ApplyCore(BindableObject bindable, Style basedOn, SetterSpecificity specificity)
at Microsoft.Maui.Controls.Style.Microsoft.Maui.Controls.IStyle.Apply(BindableObject bindable, SetterSpecificity specificity)
at Microsoft.Maui.Controls.MergedStyle.SetStyle(IStyle implicitStyle, IList`1 classStyles, IStyle style)
at Microsoft.Maui.Controls.MergedStyle.set_Style(IStyle value)
at Microsoft.Maui.Controls.NavigableElement.<>c.<.cctor>b__22_0(BindableObject bindable, Object oldvalue, Object newvalue)   
at Microsoft.Maui.Controls.BindableObject.SetValueActual(BindableProperty property, BindablePropertyContext context, Object value, Boolean currentlyApplying, SetValueFlags attributes, SetterSpecificity specificity, Boolean silent)
at Microsoft.Maui.Controls.BindableObject.SetValueCore(BindableProperty property, Object value, SetValueFlags attributes, SetValuePrivateFlags privateAttributes, SetterSpecificity specificity)
at Microsoft.Maui.Controls.BindableObject.SetValue(BindableProperty property, Object value)
at Microsoft.Maui.Controls.NavigableElement.set_Style(Style value)
at MauiReleaseXamlBug.TestPage.InitializeComponent()
at MauiReleaseXamlBug.TestPage..ctor()
at MauiReleaseXamlBug.MainPage.Button_Clicked(Object sender, EventArgs e)
RoiChen001 commented 7 months ago

Can repro this issue at Android platform on the latest 17.10 preview 2(8.0.10&8.0.14). 21661

joshball commented 7 months ago

I just had the same problem with a Style targeted for a Label type and being applied (accidently) to a VerticalStackLayout.

Is there not a tool that can walk the XAML and styles and report the errors at compile time?