xaml标记无效但仍编译/运行

时间:2014-04-01 22:12:19

标签: xaml microsoft-metro visual-studio-2013 c++-cx

我正在尝试添加自定义转换器(布尔值到可见性)。转换器的代码很好。它似乎映射好了。但是,当我尝试将其添加为用户控件的资源时,我得到一个无效标记,其中显示“找不到BooleanToVisibilityConverter。验证您没有错过程序集,并且已经构建了所有引用的程序集”。即使有这个无效标记显示项目编译并运行没有错误或崩溃。

我在Windows 8.1上使用Visual Studio 2013

转换器.h文件:

#pragma once

using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Interop;

namespace BooleanConverter{
public ref class BooleanToVisibilityConverter sealed : IValueConverter
{
public:
    virtual Platform::Object^ Convert(
        Platform::Object^ value,
        Windows::UI::Xaml::Interop::TypeName targetType,
        Platform::Object^ parameter,
        Platform::String^ language);

    virtual Platform::Object^ ConvertBack(
        Platform::Object^ value,
        Windows::UI::Xaml::Interop::TypeName targetType,
        Platform::Object^ parameter,
        Platform::String^ language);
};
}

转换器.cpp文件:

#include "pch.h"
#include "BooleanToVisibilityConverter.h"


using namespace Platform;
using namespace Windows::Foundation;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Interop;
using namespace Windows::UI::Xaml::Data;

Object^ BooleanConverter::BooleanToVisibilityConverter::Convert(Object^ value, TypeName targetType, Object^ parameter, String^ language)
{
auto boxedBool = dynamic_cast<Box<bool>^>(value);
auto boolValue = (boxedBool != nullptr && boxedBool->Value);
return (boolValue ? Visibility::Visible : Visibility::Collapsed);
}

Object^ BooleanConverter::BooleanToVisibilityConverter::ConvertBack(Object^ value, TypeName targetType, Object^ parameter, String^ language)
{
throw ref new Platform::NotImplementedException();
}

xaml代码:

<UserControl
x:Class="SimpleShop.JobItem"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:SimpleShop"
xmlns:converters="using:BooleanConverter"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" Width="1030" Height="Auto" Background="Black">
<UserControl.Resources>
    <ResourceDictionary>
        <converters:BooleanToVisibilityConverter x:Key="BooleanToCollapesdConverter"/>
    </ResourceDictionary>
</UserControl.Resources>

我尝试将xmlns语句更改为:     的xmlns:转换器= “CLR-名称空间:BooleanConverter”

但是这会引发错误,说无法找到BooleanConverter名称空间

真正奇怪的部分是,如果我删除xmlns语句并重新输入,intellisense表示无法找到命名空间。但是,如果我只是简单地将该行复制并粘贴到其自身上,那么xmlns语句中的错误就会消失。

如何摆脱这个无效的标记,因为它编译并运行,它似乎完全没有效果。或者我错过了实现这个转换器的东西?我使用MSDN作为参考(http://msdn.microsoft.com/en-us/library/ms747086(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1),对我来说,看起来我没有实现这个错误。

如果我需要提供更多代码,请告诉我,但我相信这是相关的一切。

1 个答案:

答案 0 :(得分:1)

WinRT命名空间查找规则要求winmd发布的所有命名空间都位于具有相同名称(或根命名空间名称)的winmd中。也就是说,一个名为&#34; MyNamespace.MySubNamespace.MyClass&#34;必须存在于MyNamespace.winmd或MyNamespace.MySubNamespace.winmd中,否则所有类型的加载器都无法可靠地找到它。

我认为您的问题是您的命名空间是:: Converters,但您的布尔转换器类可能隐藏在SimpleShop.winmd中。我会尝试将名称空间(和引用)更改为SimpleShop :: Converters,看看这是否可以解决您的问题。