2017-11-20 2 views
0

Ich arbeite mit Xamarin.Forms und ich habe versucht, einen benutzerdefinierten Renderer für TabbedPage (UWP) zu machen und es funktioniert irgendwie ... Aber wenn ich Versuchen Sie, ein neues DataTemplate in C# zu erstellen, das auf einen anderen benutzerdefinierten Renderer verweist Ich erhalte eine Fehlermeldung und kann keine Lösung finden.DataTemplate kann Typ nicht finden, da unbekannter Namespace, Xamarin.Forms UWP

Windows.UI.Xaml.DataTemplate GetStyledHeaderTemplate() { 
    StringBuilder tpl = new StringBuilder(); 
    tpl.Append("<DataTemplate xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\""); 
    tpl.Append(" xmlns:tint=\"clr-namespace:MyNamespace.UI;assembly=MyNamespace\""); 
    tpl.Append(" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">"); 
    tpl.Append("<StackPanel Margin=\"0\" Padding=\"5, 0\" VerticalAlignment=\"Top\">"); 
    tpl.Append("<tint:ImageTinted TintColor=\"White\" Source=\"{Binding UWPIcon}\" Width=\"24\" Height=\"24\" Margin=\"0, 5, 0, 0\" />"); 
    tpl.Append("<TextBlock Padding=\"0\" Margin=\"0, 0, 0, 4\""); 
    tpl.Append(" Text=\"{Binding Title}\" FontFamily=\"Segoe UI\" Foreground=\"White\" HorizontalAlignment=\"Center\" FontSize=\"13\" />"); 
    tpl.Append("</StackPanel>"); 
    tpl.Append("</DataTemplate>"); 
    return (Windows.UI.Xaml.DataTemplate)XamlReader.Load(tpl.ToString()); 
} 

Der Code funktioniert gut, wenn ich nicht

<tint:ImageTinted /> 

von der Datatemplate rufen Sie und ImageTinted arbeitet an anderen Orten.

Bitte, helfen!

Fehler:

Windows.UI.Xaml.Markup.XamlParseException occurred 
    HResult=0x802B000A 
    Message=The text associated with this error code could not be found. 

The type 'ImageTinted' was not found because 'clr-namespace:MyNamespace.UI;assembly=MyNamespace' is an unknown namespace. [Line: 1 Position: 339] 
    Source= 
    StackTrace: 
    at Windows.UI.Xaml.Markup.XamlReader.Load(String xaml) 
    at MyNamespace.UWP.StyledTabbedPageRenderer.GetStyledHeaderTemplate() in D:\...\MyNamespace.UWP\UI\Renderers\StyledTabbedPageRenderer.cs:line 91 
    at MyNamespace.UWP.StyledTabbedPageRenderer.OnElementChanged(VisualElementChangedEventArgs e) in D:\...\MyNamespace.UWP\UI\Renderers\StyledTabbedPageRenderer.cs:line 35 
    at Xamarin.Forms.Platform.UWP.TabbedPageRenderer.SetElement(VisualElement element) 
    at Xamarin.Forms.Platform.UWP.Platform.CreateRenderer(VisualElement element) 
    at Xamarin.Forms.Platform.UWP.VisualElementExtensions.GetOrCreateRenderer(VisualElement self) 
    at Xamarin.Forms.Platform.UWP.Platform.<SetCurrent>d__51.MoveNext() 

Antwort

0
tpl.Append(" xmlns:tint=\"clr-namespace:MyNamespace.UI;assembly=MyNamespace\""); 

ändern MyNamespace.UI auf den Namen des Namespace Montage sollte der Name der Assembly sein (in diesem Fall der Name Ihres PCL Projekt

+0

Ich habe versucht, alle Kombinationen des Namespace und erhalten den gleichen Fehler:/ – user8971976

0

Wenn im UWP-Projekt der Renderer enthalten ist und MyNamespace.UI der Namespace der Klasse ImageTinted ist und auf die Assembly verwiesen wird, ersetzen Sie

tpl.Append(" xmlns:tint=\"clr-namespace:MyNamespace.UI;assembly=MyNamespace\""); 

mit den folgenden:

tpl.Append(" xmlns:tint=\"using:MyNamespace.UI\""); 

Zum Beispiel, wenn ImageTinted im UWP-Projekt wie folgt aussehen:

<UserControl 
x:Class="MyNamespace.UI.ImageTinted" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"> 

<TextBlock Text="ImageTinted"/> 

Dies sollte die Vorlage in der XamlReader.Load Anweisung laden.

Debuggen, indem ein Haltepunkt an der Endstrebe von GetStyledHeaderTemplate() gesetzt wird, d.h. nach der return-Anweisung. Keine Ausnahmen von XamlReader.Load sollten an dieser Stelle beachtet werden. Wenn Sie immer noch Fehler haben, sollten Sie in die ImageTinted Klasse schauen. Hier

ist ein Beispiel UWP Renderer für TabbedPage:

[assembly: ExportRenderer(typeof(TabbedPage), typeof(MyTabbedPageRenderer))] 
namespace MyRenderer.UWP 
{ 
    public class MyTabbedPageRenderer : TabbedPageRenderer 
    { 
    protected override void OnElementChanged(VisualElementChangedEventArgs e) 
    { 
     base.OnElementChanged(e); 

     if (Control != null) 
     { 
      Control.HeaderTemplate = GetStyledHeaderTemplate(); 
     } 
    } 
    } 

    private Windows.UI.Xaml.DataTemplate GetStyledHeaderTemplate() 
    { 
    string xaml = @" 
<DataTemplate 
    xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"" 
    xmlns:x=""http://schemas.microsoft.com/winfx/2006/xaml"" 
    xmlns:tint=""using:MyNamespace.UI""> 
<StackPanel Orientation=""Horizontal""> 
    <tint:ImageTinted Source=""{Binding Icon}""/> 
    <TextBlock Text=""{Binding Title}"" FontFamily=""Segoe UI"" 
FontSize=""13"" /> 
</StackPanel> 
</DataTemplate>"; 

    return (Windows.UI.Xaml.DataTemplate)XamlReader.Load(xaml); 
    } 
} 
+0

Ihre Lösung getestet, aber bekam das gleiche Ergebnis. Das Einfügen von tmpXaml in MainPage gab mir einige Fehler: - Der angegebene Wert kann der Sammlung nicht zugewiesen werden. Die folgende Art erwartet wurde: „UIElement“ und - Ein Wert vom Typ ‚ImageTinted‘ kann nicht auf eine Sammlung oder ein Wörterbuch des Typs auf return-Anweisung – user8971976

+0

gleichen Fehler ‚UIElementCollection‘ hinzugefügt wird – user8971976

+0

I ersetzt sogar ImageTinted mit anderem Benutzerdefinierte Steuerelemente aber es hat nicht funktioniert. ImageTinted ist ein benutzerdefiniertes C# -Steuerelement, das ansonsten einwandfrei funktioniert. Es ist nur, wenn ich versuche, es von einem benutzerdefinierten TabbedPageRenderer für UWP aufzurufen, dass es fehlschlägt. – user8971976

Verwandte Themen