我正在使用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()
tpl.Append(" xmlns:tint=\"clr-namespace:MyNamespace.UI;assembly=MyNamespace\"");
将MyNamespace.UI更改为命名空间程序集的名称应该是程序集的名称(在本例中是PCL项目的名称)
在包含渲染器的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);
}
}