DataTemplate无法找到类型,因为未知的命名空间,Xamarin.Forms UWP

问题描述 投票:0回答:2

我正在使用Xamarin.Forms,我正在尝试为TabbedPage(UWP)创建一个自定义渲染器,它有点工作......但是当我尝试在C#中创建一个新的DataTemplate引用另一个自定义渲染器时,我得到一个错误,我找不到任何解决方案。

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());
}

我不打电话时代码工作正常

<tint:ImageTinted />

来自DataTemplate和ImageTinted在其他地方工作。

请帮忙!

错误:

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()
c# xamarin.forms uwp datatemplate
2个回答
0
投票
tpl.Append(" xmlns:tint=\"clr-namespace:MyNamespace.UI;assembly=MyNamespace\"");

将MyNamespace.UI更改为命名空间程序集的名称应该是程序集的名称(在本例中是PCL项目的名称)


0
投票

在包含渲染器的UWP项目中,假设MyNamespace.UI是ImageTinted类的命名空间并引用了程序集,请替换此

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

以下内容:

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

例如,如果UWP项目中的ImageTinted如下所示:

<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"/>

这应该在XamlReader.Load语句中加载模板。

通过在GetStyledHeaderTemplate()的结束括号处设置断点来调试,即在return语句之后。此时不应出现XamlReader.Load的例外情况。

如果你仍然有错误,那么你应该查看ImageTinted类。

以下是TabbedPage的示例UWP渲染器:

[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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.