xamlwinrt-xamlattached-propertiesxamlreaderuwp

WinRT / UWP: Loading RelativePanel with XamlReader causes XamlParseException with RelativePanels Attached Properties


I'm trying to use the XamlReader to parse a XAML File on during runtime. Unfortunately I get a XamlParseException when the XamlReader tries to read the Relative Attributes like RelativePanel.Below.

This is the Code to load the xaml file:

using System;
using System.IO;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Markup;

namespace TestProject.UWP.Views
{
    public sealed partial class LoginPage : Page
    {
        public LoginPage()
        {
            this.InitializeComponent();
            Loaded += OnLoaded;
        }

        private async void OnLoaded(object sender, RoutedEventArgs routedEventArgs)
        {
            var folder = Windows.ApplicationModel.Package.Current.InstalledLocation;
            folder = await folder.GetFolderAsync("TestData");
            var file = await folder.GetFileAsync("LoginControl.xaml");
            var xaml = await FileIO.ReadTextAsync(file);
            var content = (UserControl)XamlReader.Load(xaml);
            this.Content = content;
        }
    }
}

And this the xaml file i try to read from the local content

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:TestProject.UWP.Views"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="800"
    d:DesignWidth="600">

    <RelativePanel Background="LightGray">
        <Border x:Name="logoBorder" BorderBrush="White" BorderThickness="0,0,0,1" Margin="30,30,30,10" Width="200" Height="60" Padding="0,0,0,5" RelativePanel.AlignLeftWithPanel="True" RelativePanel.AlignRightWithPanel="True" RelativePanel.AlignTopWithPanel="True" >
            <Image Stretch="Uniform" Source="ms-appx:///Assets/Images/logo.png" Width="200" />
         </Border>
        <Image x:Name="userIcon" Source="ms-appx:///Assets/Images/usericon.png" Margin="30,10" RelativePanel.AlignHorizontalCenterWithPanel="True" RelativePanel.AlignRightWith="logoBorder" Width="100" Height="100"/>
    </RelativePanel>
</UserControl>

When i try to parse the xaml i get the following Exception: "WinRT information: RelativePanel error: Value must be of type UIElement."

As soon as i remove the attribute RelativePanel.AlignRightWith="logoBorder" from the second image everythings work fine.

Does someone has a idea to workaround this problem?

Edit: Before you ask. The xaml should later be loaded from a server that's why i don't just instantiate a instance of the usercontrol in code.

Cheers

Kornelis


Solution

  • Replace the element name in

    RelativePanel.AlignRightWith="logoBorder" 
    

    by an ElementName binding:

    RelativePanel.AlignRightWith="{Binding ElementName=logoBorder}"