I have the following situation:
We have / build an Xamarin.Forms library, that also should include our common icons
This icons should be used in XAML ages in this library but also in the final apps
Library structure
Base.Library (.Net Standard 2.0 + Xamarin.Forms)
|- Views (XAML)
Base.Library.Android
|- Resources
|- drawables
|- icon.xml
Base.Library.iOS
|- Assets
|- icon (image asset with 3 resolutions)
Base.Library.Upw
|- Icons
|- icon.scale-100.png
|- ...
|- icon.scale-400.png
The icons work on iOS and Android without problem (in XAML page of the ibrary project and in the final app project, that uses the library).
<Image WidthRequest="24" HeightRequest="24" VerticalOptions="Center"
HorizontalOptions="End">
<Image.Source>
<OnPlatform x:TypeArguments="ImageSource">
<On Platform="Android,iOS" Value="icon" />
<On Platform="UWP" Value="Icons/icon.png" />
</OnPlatform>
</Image.Source>
</Image>
Only UWP doesn't work. Is the a special syntax to load images from libraries?
I already tried the following:
// Prefixed with assembly name of the library
Value="ms-appx:///Base.Library.Uwp/Icons/icon.png"
// Prefixed with namespace of the library
Value="ms-appx:///Base.Library.Uwp.Namespace/Icons/icon.png"
I found a solution.
If I have ms-appx:/// in the value, this is treated as UriImageSource instead of FileImageSource. If I cut this away and use the full path to the icon (incl. assembly name), the icons is also shown for UWP.
<Image WidthRequest="24" HeightRequest="24" VerticalOptions="Center"
HorizontalOptions="End">
<Image.Source>
<OnPlatform x:TypeArguments="ImageSource">
<On Platform="Android,iOS" Value="icon" />
<!-- Icon name prefixed with assembly name -->
<On Platform="UWP" Value="Base.Library.Uwp/Icons/icon.png" />
</OnPlatform>
</Image.Source>
</Image>
Related
I have a project in xamarin forms 4.6 that updated to xamarin forms 5.0, but when I run the project. This error occurs.
The type 'xct:MediaElement' was not found. Verify that you are not missing an assembly reference and that all referenced assemblies have
been built.
I already added this reference xmlns:xct="http://xamarin.com/schemas/2020/toolkit" in my ContentPage but the problem still exist.
here is my code.
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:xct="http://xamarin.com/schemas/2020/toolkit"
x:Class="Proyekto4Juan.Views.IndexPage">
<Grid>
<xct:MediaElement x:Name="BgVideo" Source="ms-appx:///video.mp4" ShowsPlaybackControls="False"
IsLooping="True" AutoPlay="True" Aspect="AspectFill"
HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand" />
</Grid
</ContentPage>
Thanks in Advance.
You can recheck if you have installed nuget Xamarin.CommunityToolkit.
And add the following code :
xmlns:xct="clr-namespace:Xamarin.CommunityToolkit.UI.Views;assembly=Xamarin.CommunityToolkit"
The Xamarin Community Toolkit is a collection of common elements for mobile development with Xamarin.Forms that people tend to replicate across multiple apps. It simplifies and demonstrates common developer tasks when building apps with Xamarin.Forms.
For more details, you can check document :Xamarin Community Toolkit MediaElement.
You can also refer to the sample code MediaElementDemos.
A usage sample from above sample is AspectVideoPage.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"
xmlns:xct="clr-namespace:Xamarin.CommunityToolkit.UI.Views;assembly=Xamarin.CommunityToolkit"
xmlns:controls="clr-namespace:MediaElementDemos.Controls"
x:Class="MediaElementDemos.AspectVideoPage"
Title="Change aspect ratio">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<xct:MediaElement x:Name="mediaElement"
Grid.Row="0"
AutoPlay="False"
ShowsPlaybackControls="True"
Source="{StaticResource AdvancedAsync}" />
<StackLayout Grid.Row="1"
Margin="0,0,0,40"
Orientation="Horizontal"
HorizontalOptions="Center">
<Label Text="Aspect:"
VerticalTextAlignment="Center" />
<controls:EnumPicker x:Name="aspectEnumPicker"
EnumType="{x:Type Aspect}"
SelectedIndex="0"
SelectedIndexChanged="OnAspectSelectedIndexChanged" />
</StackLayout>
</Grid>
</ContentPage>
For the Uno platform, I would like to load an image (PNG) from Assets, using XAML. Further, I'd like to use a single image for all target platforms and have it scale to the size of its container.
Is this possible ?
I have succeeded to do this for UWP and Wasm with the following syntax:
<Image Source="Assets/icons/arrow_back_white.png" />
However, for Android, no image is displayed, I just see my background color.
I realize that the proper approach is to provide separate images for each target platform and, optionally, separate images for each resolution in each platform. That is a nice ideal but I am trying to avoid that enormous development overhead, at least for now.
Thanks.
EDIT:
First, to be extra clear, I do have Content selected for my images.
I'm getting a worse failure when using AppBarButton, e.g.:
<CommandBar>
<AppBarButton Icon="arrow_back_white.png" Label="Back" Click="OnBackClicked" />
<AppBarButton Icon="arrow_back_white.png" Label="Page" Click="OnPageClicked" />
<AppBarButton Icon="more_menu_white.png" Label="More" Click="OnMoreMenuClicked"/>
</CommandBar>
This fails for UWP during app initialization with an error:
Failed to create a 'Windows.UI.Xaml.Controls.IconElement' from the text 'arrow_back_white.png'.
It also fails with a build error for Wasm and Android.
It doesn't matter if I put the icon files directly in the Assets directory or a nested directory.
What is the correct syntax and configuration to reference icons and images ?
EDIT 2:
Still doesn't work for Android, but does work for UWP and Wasl. I moved my images into the Assets directory and have this XAML:
<Button
Width="25" Height="25"
Padding="5"
Click="OnBackClicked" >
<Image Source="ms-appx:///Assets/arrow_back_white.png" Height="100" Width="100" />
</Button>
<Button
Width="25" Height="25"
Padding="5"
Click="OnPageClicked" >
<Image Source="ms-appx:///Assets/crop_din_white.png" />
</Button>
<Button
Width="25" Height="25"
Padding="5"
Click="OnMoreMenuClicked" >
<Image Source="ms-appx:///Assets/more_menu_white.png" />
</Button>
All three buttons show up as blank grey approx 1cm high and wide.
EDIT 3
Tried with a newly created default app, which works. The only change I made to the code is to MainPage.xaml by removing the grid and adding:
<StackPanel Orientation="Horizontal" HorizontalAlignment="Right" >
<Button
Width="25" Height="25"
Padding="5" >
<Image Source="ms-appx:///Assets/arrow_back_white.png" Height="100" Width="100" />
</Button>
<Button
Width="25" Height="25"
Padding="5" >
<Image Source="ms-appx:///Assets/crop_din_white.png" />
</Button>
<Button
Width="25" Height="25"
Padding="5" >
<Image Source="ms-appx:///Assets/more_menu_white.png" />
</Button>
</StackPanel>
So, now, the arduous task of finding the significant difference(s).
I had a similar issue and here is how I resolved it. I used the following:
<Image Source="ms-appx:////Assests/yourimage.png">
The other thing I did- you probably have done this already- but I had to put a transparent border around it. Hopefully this is helpful!
Let's say you have a Directory under the Shared Project called Assets and inside you have an image called wasm_logo.png.
As Jt6 indicated you should be able to use that image for all the different platforms Uno supports, including Android by using this:
<Image Source="ms-appx:///Assets/wasm_logo.png" Height="300" Width="300"/>
Note: If you have a nested Directory, another directory inside Assets, you just need to add it as part of the path.
<Image Source="ms-appx:///Assets/Icons/wasm_logo.png" Height="300" Width="300"/>
The code above will work if your wasm_logo.png image is inside an Icons Directory which is inside the Assets directory.
Considerations:
Images should be marked as Content (you already validated this)
To Scale for different sizes Uno Supports (as UWP) different Assets qualifiers. Let's say that the same image you want to support 3 different sizes, then you would these 3 files inside the Assets Directory:
wasm_logo.scale-100.png
wasm_logo.scale-300.png
wasm_logo.scale-500.png
For Android these are translated into mdpi, xhdpi and xxhdpi. But the best part is that to use it you do not need to specify the size and with the same code as above you will get the same result.
<Image Source="ms-appx:///Assets/wasm_logo.png" Height="300" Width="300"/>
Note: For Android when you do not specify any qualifier the Images is treated as nodpi
More about Assets and qualifiers can be read here.
If the above is still not working try updating your Uno.Platform to the latest version.
You could also validate that no errors are being reported on the Visual Studio Output Window when running the app.
As a final thing, you could try checking if the images are being moved correctly at compile time. You can do this by building your Android project and then opening the File Explorer at this route:
ProjectName\ProjectName.Droid\obj\Debug\100\res
Inside there you should find the Drawable Directories for Android.
Following the first example, your image should be in the Drawable-nodpi folder
Hope this is useful.
Andres
App Runining
I am sorry that did not help. Just checking something obvious- did you add the picture to the Shared Project Assets folder?
I have a working app that displays images. I started a new app and copied the code but this new app does not display images. Puzzled, I have tried many, many things to debug it. I eventually made a plain vanilla new project with only an Image control. As usual, I added the picture to the project using Add Existing Item. I confirmed that the image is there. It does not display the image. I noticed something different in Solution Explorer. Under the Solution, the first project has Dependencies listed under it. This is new. My previous apps have never had that. Now every new project I create has it. I also noticed that the Properties of the image was Build Action of None. I tried changing it to Content but that did not help. At this point, I am baffled and stuck. Did something change in Visual Studio? Here is the image test 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"
xmlns:local="clr-namespace:ImageTest"
x:Class="ImageTest.MainPage">
<StackLayout>
<!-- Place new controls here -->
<Image Source="gr8oz.png" />
<Label Text="Welcome to Xamarin.Forms!"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand" />
</StackLayout>
</ContentPage>
As I said, I have a working app that has been released. I copied this code into a new app and it does not work. In my investigation, I have found that the Image control does not work for me anymore.
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:OFamV2"
Style="{StaticResource MyContentPage}"
x:Class="OFamV2.MainPage"
Title="Main Menus">
<ScrollView>
<StackLayout>
<Button x:Name="TreeButton"
Text="Don and Iola Osborne"
VerticalOptions="Start"
Style="{StaticResource MyButtons}"
Clicked="TreeButton_Clicked" />
<Button x:Name="IndianNamesButton"
Text="Indian Names"
VerticalOptions="Start"
Style="{StaticResource MyButtons}"
Clicked="IndianNamesButton_Clicked" />
<Button x:Name="NextPageButton"
Text="Indian Potpourri"
VerticalOptions="Start"
Style="{StaticResource MyButtons}"
Clicked="NextPageButton_Clicked" />
<Button x:Name="OldPhotos"
Text="Old Photos"
VerticalOptions="Start"
Style="{StaticResource MyButtons}"
Clicked="OldPhotos_Clicked" />
<Button x:Name="ReunionButton"
Text="Family Reunion"
VerticalOptions="Start"
Style="{StaticResource MyButtons}"
Clicked="ReunionButton_Clicked"
/>
<StackLayout Orientation="Horizontal">
<Image
Source="Photos/gr8oz.png"
Style="{StaticResource MyImage}"
Margin="0,30,0,0"
Aspect="AspectFit"
HorizontalOptions="End"
/>
<Image
Source = "Photos/logo.bmp"
Style="{StaticResource MyImage}"
Margin="150,0,0,0"
HeightRequest="200"
WidthRequest="200"
HorizontalOptions="End"/>
</StackLayout>
</StackLayout>
</ScrollView>
</ContentPage>
I have searched and read everything that I can find (and yes, I have read the Microsoft doc about the Image class).
I am also curious why Dependencies suddenly appeared in the Shared Project folder. This is new too. How do I resolve them? See screenshot.
Dependencies under OFamV2.
I uninstalled Visual Studio, deleted the folder, reinstalled Visual Studio Community 2017 Version 15.8.8 and the problem is still there, even with a new project.
For Options, I select Cross Platform/ Mobile App/ Platform: Android and UWP/Code Sharing: .Net Standard.
Set image show you can see here , i think you have used that.
So reload your project,and rebuild it,you can try this.
More info:
Here is a similar disscussion about image show.
Suggest that better not copy code from other project about view,they may result some problems where you do not know.
I have an IOS Application with embedded Xamarin Forms. I created a simple view with buttons and want to set the height of these buttons depending on the platform. This is my code:
<Button Text="{Binding SendFeedbackButtonText}"
Command="{Binding SendEarlyFeedbackCommand}"
HorizontalOptions="FillAndExpand"
Margin="3,0,3,0" >
<Button.Effects>
<effects:PrimaryButtonEffect />
</Button.Effects>
<Button.HeightRequest>
<OnPlatform x:TypeArguments="x:Double">
<On Platform="iOS" Value="37"/>
</OnPlatform>
</Button.HeightRequest>
</Button>
But this gives me the following error in build:
No property, bindable property, or event found for 'HeightRequest', or mismatching type between value and property.
When I set HeightRequest fix in the button tag it works.
Xamarin.Forms version: 2.5.0.121934
Also I created a new blank App with Xamarin.Forms and .net standard 2.0 to try this out. It works as long as you don't have the XamlCompilation Attribute set:
[XamlCompilation(XamlCompilationOptions.Compile)]
You can find the project here: https://github.com/NPadrutt/FormsButtonIssueTestProject
What am I doing wrong?
Depending on your version of Forms try switching it to this instead
<Button.HeightRequest>
<OnPlatform x:TypeArguments="x:Double" iOS="37"/>
</Button.HeightRequest>
or
<Button.HeightRequest>
<OnPlatform x:TypeArguments="x:Double">
<On Platform="iOS">37</On>
</OnPlatform>
</Button.HeightRequest>
I am trying to integrate ads into a already successful deployed app. However no matter what I do, I cannot seem to get the ads working. I have tried using both the code version and the drag n' drop gui version. Neither of which I can get to work.
This is what I see: When it starts up it may flash for a split second white, where the ad is supposed to be, but none the less, no adds. It recognizes that it is where I place it, when I place it over a button, the button becomes unclickable. All being said, no default "microsoft advertising" image pops up. I have installed the ad SDK and have successfully been able to make the ads display in other project with ease.
What gives? This is very simple page and I cannot figure out what is wrong. It also seems that I cannot place an ad on any of the other pages either... I do have the Microsoft.Advertising.Mobile and Microsoft.Advertising. Mobile.UI included in the project and my internet is working (I have an project open at the same time with ads and it works)
<phone:PhoneApplicationPage
x:Class="AppName.AdPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d" d:DesignHeight="768" d:DesignWidth="480"
shell:SystemTray.IsVisible="True"
xmlns:my="clr-namespace:Microsoft.Advertising.Mobile.UI;assembly=Microsoft.Advertising.Mobile.UI">
<!--LayoutRoot is the root grid where all page content is placed-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel contains the name of the application and page title-->
<StackPanel x:Name="TitlePanel" Margin="12,17,12,28">
<TextBlock x:Name="PageTitle" Text="Thank You!" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}" Width="334" />
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0" Height="569" VerticalAlignment="Top">
<Button Content="Ok" Height="72" HorizontalAlignment="Center" Margin="0,428,0,0" Name="button1" VerticalAlignment="Top" Width="160" Click="button1_Click" />
<my:AdControl AdUnitId="Image480_80" ApplicationId="test_client" Height="80" HorizontalAlignment="Left" Margin="-12,458,0,0" Name="adControl1" VerticalAlignment="Top" Width="480" />
</Grid>
</Grid>
</phone:PhoneApplicationPage>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Advertising.Mobile.UI;
using Microsoft.Advertising.Mobile;
namespace Stickey_Note_v._1
{
public partial class AdPage : PhoneApplicationPage
{
public AdPage()
{
InitializeComponent();
}
private void button1_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
}
}
}
I had the same issue and wrote a blog post about it. Here's the important stuff:
The symptoms of a problem with the SDK's AdControl seem to be pretty consistent: The page loads, the control flickers briefly, showing the hint of a 1 pixel frame, and then, poof. It collapses into nothingness, leaving only a black hole of dispair.
In theory, setting up the AdControl is simple. The documentation from Microsoft outlines the basics:
Download and install the Microsoft Advertising SDK.
Add a reference to Microsoft.Advertising.Mobile.UI.
Drag the control onto the page in the Visual Studio designer.
Set the AdUnitId and ApplicationId properties to either test values or actual live values, which you can obtain from Microsoft pubCenter.
But it couldn't be that easy. I followed the documentation carefully, but nothing was working. I couldn't even get test ads to show up, which seemed really weird. I even reverted to an older version of my app (yay source control!) and dropped in the new .dll. Failure.
Finally, I found a clue in an obscure forum post.
The Microsoft documentation neglects to mention several important details. You need to pay particular attention to the following if you're upgrading an existing project to the Mango ad SDK, as I was:
You must specify a height and width for the AdControl. Failing to specify the Height and Width attributes, or setting them to auto, will cause tears of frustration. I'd recommend 80 pixels high and 480 pixels wide, as that's the native size of the ads that Microsoft serves up.
It seems that you can't have two AdControls on the same page, or at least not in the same parent element. The second one will collapse. There might be a way around this, but I discovered it while building my demo app and didn't care to pursue a solution.
You must must must specify certain capabilities in your WMAppManifest.xml file. Since I was upgrading my app, I didn't have some of the newer capabilities declared. The one that was causing all the trouble was ID_CAP_IDENTITY_USER. The following capabilities are all required for the control to function correctly:
<Capabilities>
<Capability Name="ID_CAP_IDENTITY_USER"/>
<Capability Name="ID_CAP_MEDIALIB"/>
<Capability Name="ID_CAP_NETWORKING"/>
<Capability Name="ID_CAP_PHONEDIALER"/>
<Capability Name="ID_CAP_WEBBROWSERCOMPONENT"/>
</Capabilities>
Hope that helps!
I think your problem could come from (if you didn't remove it for posting it here):
<my:AdControl AdUnitId="Image480_80" ApplicationId="test_client" Height="80" HorizontalAlignment="Left" Margin="-12,458,0,0" Name="adControl1" VerticalAlignment="Top" Width="480" />
</Grid>
You have to use AdUnitId and ApplicationId which you get from pubCenter.
One more think to note for those still struggling
xmlns:ads="clr-namespace:Microsoft.Advertising.Mobile.UI;assembly=Microsoft.Advertising.Mobile.UI"
<ads:AdControl Height="80"
Width="480"
AdUnitId="Image480_80"
ApplicationId="test_client" />
As in example. Declaring ads and the namespace is super important.
In my project i just inserted the adcontrol part alt + enter for resharper to do the rest of the work which he didnt. He replaces ads with UI and there was no error compilation still the ads wouldn't show. When i declared ads myself and changed the adcontrol namespace. Everything worked fine.