3
votes

I'm trying to convert my Win32 app into a UWP app using Project Centennial converter (i.e. Desktop bridge.)

After the app is converted, I need to adjust AppxManifest.xml file to ensure the following:

  • That all icon formats are configured properly.

  • That I properly specified app resources for: English (US), German, French and Russian languages.

So I followed this Windows 10 icon guide and created the following .png images that were all placed into the Assets folder. I got these:

enter image description here

And my AppxManifest.xml was structured as such:

<?xml version="1.0" encoding="utf-8"?>
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap2="http://schemas.microsoft.com/appx/manifest/uap/windows10/2" xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3" xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities" xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10">
  <Identity Name="MyApp.Name" ProcessorArchitecture="x86" Publisher="CN=My Name, O=My Name, STREET=&quot;Street Address&quot;, L=City, S=State, PostalCode=12345, C=US" Version="1.2.3.4" />
  <Properties>
    <DisplayName>MyApp.Name</DisplayName>
    <PublisherDisplayName>PublisherName</PublisherDisplayName>
    <Logo>Assets\StoreLogo-50x50.png</Logo>
  </Properties>
  <Resources>
    <Resource Language="en-us" />
    <Resource Language="de-DE" />
    <Resource Language="fr-FR" />
    <Resource Language="ru-RU" />
  </Resources>
  <Dependencies>
    <TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14342.0" MaxVersionTested="10.0.14342.0" />
  </Dependencies>
  <Capabilities>
    <rescap:Capability Name="runFullTrust" />
  </Capabilities>
  <Applications>
    <Application Id="MyApp.Name" Executable="VFS\Users\ContainerAdministrator\AppData\Local\PublisherName\App Name\RunFile.exe" EntryPoint="Windows.FullTrustApplication">
      <uap:VisualElements DisplayName="My App Name" Description="My app does this ... and this ..." 
                          BackgroundColor="#aabbcc" 
                          Square71x71Logo="Assets\AppNameSmallTile.png"
                          Square150x150Logo="Assets\AppNameMedTile.png"
                          Square310x150Logo="Assets\AppNameWideTile.png"
                          Square310x310Logo="Assets\AppNameLargeTile.png"
                          Square44x44Logo="Assets\AppNameAppList.png"
                          >
        <uap:DefaultTile>
          <uap:ShowNameOnTiles>
            <uap:ShowOn Tile="square150x150Logo" />
            <uap:ShowOn Tile="Square310x150Logo" />
            <uap:ShowOn Tile="Square310x310Logo" />
          </uap:ShowNameOnTiles>
        </uap:DefaultTile>
      </uap:VisualElements>
      <Extensions />
    </Application>
  </Applications>
</Package>

So can someone answer these questions:

  1. I'm somewhat confused about specifying icons for correct sizes and scaling. Did I do it correctly?

  2. Do I need to specify scaling for Assets\StoreLogo-50x50.png icon as well?

  3. And lastly, did I specify resources for 4 different languages correctly?

EDIT: While waiting, I tried compiling my AppxManifest.xml above with the assets I showed. But makeappx.exe tool gives me the following error:

MakeAppx : error: Error info: error C00CE015: App manifest validation error: The app manifest must be valid as per schema: Line 22, Column 27, Reason: The attribute 'Square71x71Logo' on the element '{http://schemas.microsoft.com/appx/manifest/uap/windows10}VisualElements' is not defined in the DTD/Schema.

It evidently doesn't like the following icon sizes:

Square71x71Logo
Square310x150Logo
Square310x310Logo

But then even if I remove the icon sizes above from AppxManifest.xml, when I try to pack it with the following command:

"C:\Program Files (x86)\Windows Kits\10\bin\x64\makeappx.exe" pack /d "path-to-folder-to-pack" /p "path-to\MyAppxPackage.appx"

I get the following errors about naming assets for scaling:

MakeAppx : error: Manifest validation error: Line 22, Column 27, Reason: The file name "Assets\AppNameMedTile.png" declared for element "[local-name()='Applications']/[local-name()='Application']/[local-name()='VisualElements']" doesn't exist in the package. If this file has multiple variations or resource versions for language, scale, contrast, etc., use the /l command line option to disable this validation. MakeAppx : error: Manifest validation error: Line 23, Column 27, Reason: The file name "Assets\AppNameAppList.png" declared for element "[local-name()='Applications']/[local-name()='Application']/[local-name()='VisualElements']" doesn't exist in the package. If this file has multiple variations or resource versions for language, scale, contrast, etc., use the /l command line option to disable this validation. MakeAppx : error: Package creation failed. MakeAppx : error: 0x80080204 - The specified package format is not valid: The package manifest is not valid.

Using suggested /l command as such:

"C:\Program Files (x86)\Windows Kits\10\bin\x64\makeappx.exe" pack /l /d "path-to-folder-to-pack" /p "path-to\MyAppxPackage.appx"

builds the package with a lot of warnings. But when I install it later, all icons in it seem to be blank.

There must be something that I'm missing here?

1
I'm interestend in question #3 ...m02ph3u5

1 Answers

2
votes

I see two main problems: you're defining tile images in the wrong place, and you don't talk at all about a resources.pri file.

The UAP schema is fairly involved, but also reasonably well documented, so make sure you respect its requirements. In particular, the uap:VisualElements element only has the image attributes Square150x150Logo and Square44x44Logo. If you want to define other sizes, they go in attributes on a child uap:DefaultTile element. Note that your uap:ShowOn elements' attributes include an incorrect Square310x150Logo that should instead be wide310x150Logo.

Once you sort that out, makeappx should succeed with your original command line, i.e., without the additional /l parameter. However this is not enough to make your alternate DPI images show up. For that you will need to create a resources.pri file. You can do this manually by using makepri.exe to create a template priconfig.xml, update it, then invoke makepri again to build the resources.pri from it.

Alternately, use a tool that will create an app package with a resources.pri for you (such as Visual Studio), and extract the resources.pri and add it to your package. Just make sure the locations you use in your package match the ones in the package created by the tool, as relative paths are stored in the resources.pri file. (As a bonus, you can look at the AppxManifest.xml that this creates to verify that your structure from the first part is correct. Just don't forget that apps using the desktop bridge will have additional namespaces and capabilities that Visual Studio won't offer.)