-
Notifications
You must be signed in to change notification settings - Fork 1.9k
OnPlatform/OnIdiom markup extensions #2608
Comments
This would be legit cool. As long as it is properly documented etc. Definitely helps reduce complexity, verbosity and improves readability. If we had blend on OSX and it supported Xamarin Forms then I could argue it's not needed but we don't. |
I'm into this! |
This is a great idea!! It will really simplify the verbosity of the XAML which is a pretty big complaint I hear often about using the OnPlatform feature in XAML |
I got this working locally, can someone once over my change before I submit the PR? I wasn't able to test this working from the Xamarin.Forms solution but I was able to create this exact same code inside a Xamarin.Forms project and it worked. See the commit in my fork above |
While I have this code working as a Custom markup extension I am unable to get it working in the Xamarin.Forms platform. I'm not going to be able to submit a PR with what I have because it doesn't work. I would love some help to get us over this blocker so we can get a PR submitted to add this new markup extension |
* Added OnPlatform markup extension supporting iOS/Android/UWP for #2608 * Add Default and Other properties to OnPlatformExtension This allows setting a default value for unknown platforms, as well as specify values for arbitrary platforms by using a named parameter like syntax: `{OnPlatform Android=15, iOS=10, UWP=12, Default=11, Other=Tizen:20}` The `Other` supports multiple semi-colon separated values. By using this format, we can make the string more concise than if we used `=` which would have to be escaped in quotes. For example: `{OnPlatform Default=10, Other=Tizen:22;Xbox:20;Switch=25;PlayStation=22}` Added unit tests that verify all the supported combinations. * Add OnIdiomExtension The extension allows the following syntax: `{OnIdiom Phone=23, Tablet=25, Desktop=26, TV=30, Watch=10, Default=20}` At least one value or `Default` must be specified. `Default` is returned whenever the specific idiom was not specified. * Add missing known platforms and return Default if missing Add all strings that are provided in `Device`. Convert individual asserts into test cases for better reporting. Also, whenever a matching platform value isn't specified, return Default instead of null. * Turn OnIdiom asserts into test cases This makes for easier to read, document and report tests. * Add missing platforms to null check * Make Default the content property * Perform type conversion as expected by XamlC Leverage the conversion that is used elsewhere, to return a properly typed object that can be assigned directly to the property. Update tests with typed values since now we get integers, rather than strings out of the parser. * Add Converter/ConverterParameter support * Message should state that the value must be non-null * Remove Unsupported idiom since it's not useful to set You can use Default instead. * Use new GetService<T> extension method for conciseness * Don't fail if service provider is null * Remove Other from OnPlatformExtension As suggested, this might come back in the future in some other form.
I am using Xamarin.Forms version 3.2.0.809874-pre3 I am facing a problem that with this version I am getting the error "The property 'Default' is set more than once" when using OnPlatform at XAML. Here is my code:
|
@asafgo that's not the markup extension form that this issue refers to. The markup extension format for your page would be:
Which is arguably immensely more concise ;) |
I try to bind Current solution, enabled for all Platforms: <StackLayout IsVisible="{Binding Visible}"> Attempt with the old style <StackLayout>
<StackLayout.IsVisible>
<OnPlatform x:TypeArguments="x:Boolean">
<On Platform="WinPhone" Value="{Binding Visible}"></On>
</OnPlatform>
</StackLayout.IsVisible> Attempt with the new stype: <StackLayout IsVisible="{x:OnPlatform UWP={Binding Visible}}"> Could anyone please also tell me if |
@AtosNicoS both OnPlatform syntax expect values, not bindings |
Description
Sometimes changing a single property value per platform is quite convenient, yet the "full" syntax of
OnPlatform
is overkill for scalar values in attributes.For example:
vs a markup extension version that could provide:
Same thing applies for
OnIdiom
, so I think both would make XAML much more concise.The text was updated successfully, but these errors were encountered: