我在VS2010中有一个使用XAML的项目,现在我需要将它加载到Expression Blend 4中。该项目在VS2010中构建并运行,这是第一次加载到Blend中。即使成员不被识别,它也可以在Blend中构建和运行。
为什么Scale属性无法识别,为什么它在功能上有效时会显示为错误?
编辑虽然这会构建并运行,但XAML不会在Blend中以图形方式显示,因此无法由非技术用户修改。
在包含对usercontrols的引用的许多.xaml文件中,Blend无法识别出错误的属性:
The member "XXXX" is not recognized or is not accessible
该属性存在于.cs代码隐藏文件中,并且在每种情况下错误消息都是相同的。
我在互联网上看了很多可能的答案,但没有一个是解决方案。引用的项目不是只读的。各种类和属性都是公共的。我还将以下WPF引用添加到.csproj文件中,该文件丢失了。
<ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
在以下代码中,即使Scale属性作为用户控件中的属性存在,也无法识别它。
以下是MyLogo.xaml中的UserControl:
<UserControl x:Class="NamespaceX.NamespaceY.UI.Shapes.MyLogo"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Height="132" Width="105">
<Canvas>
<Canvas.LayoutTransform>
<ScaleTransform x:Name="st" CenterX="0" CenterY="0" />
</Canvas.LayoutTransform>
<Image Source="/Client;component/Images/MyLogo.png"/>
</Canvas>
以下是MyLogo.xaml.cs中的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace NamespaceX.NamespaceY.UI.Shapes
{
/// <summary>
/// Interaction logic for MyLogo.xaml
/// </summary>
public partial class MyLogo : UserControl
{
public double Scale
{
get
{
return st.ScaleX;
}
set
{
st.ScaleX = value;
st.ScaleY = value;
}
}
public MyLogo()
{
InitializeComponent();
}
}
}
在我的Navigation.xaml文件中,我有:
<UserControl x:Class="NamespaceX.NamespaceY.UI.UserControls.Navigation"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:shape="clr-namespace:NamespaceX.NamespaceY.UI.Shapes"
Height="185" Width="1280" Loaded="UserControl_Loaded">
<FrameworkElement.Resources>
<ResourceDictionary Source="../Resources/Main.xaml" />
</FrameworkElement.Resources>
<Canvas>
<shape:MyLogo Scale="1.2" Height="181.483" Canvas.Left="38" Canvas.Top="4" Width="188" />
<StackPanel Canvas.Left="205" Canvas.Top="-2" Width="1062">
</StackPanel>
</Canvas>
答案 0 :(得分:17)
这是解决方案。在应用程序的.csproj文件中,更改此:
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">x86</Platform>
到此:
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
不要被Visual Studio在配置管理器中报告您在AnyCPU中运行的事实所迷惑。您必须手动编辑.csproj文件。
答案 1 :(得分:10)
它们与更改平台更改缓存程序集的事实有关。接受的答案是不可接受的。
这是我的建议:
受影响的XAML现在应该没有构建错误。
这适用于我,您的结果可能会有所不同。
答案 2 :(得分:1)
将项目的构建属性更改为“任何CPU”为我解决了问题。我仍然无法理解这与问题有何关系。但当然它真的很神奇。
答案 3 :(得分:1)
正如其他人所说,将目标从x64更改为AnyCPU会修复设计器中的错误,这看起来很奇怪。
我在Visual Studio论坛上找到了以下内容:
(Q)当文档包含自定义元素(例如,带有用户控件的XAML)时,x64和ARM目标平台的设计视图不可用。
(A)从Visual Studio 2015开始,即使你定位的是x86以外的任何东西,我们也能让你设计/编写你的XAML。 Visual Studio 2015 Update 2应该汇集几个修复和更改,以使这种体验更好地工作。
但是,值得注意的是,当项目针对除x86之外的任何内容时,我们将无法执行您在设计器中编写的任何代码。这是因为x86进程(XAML设计器所在)无法运行ARM或x64代码。您应该能够查看和编辑页面上的所有XAML,并将任何自定义类型替换为替换,以尽可能地保留WYSIWYG体验(并在您真正关心在设计器中运行代码时切换到x86)。
答案 4 :(得分:0)
我在Silverlight上遇到同样的问题,结果是我的用户控件上的命名空间太长了,我只是缩短了它的工作原理。希望它有所帮助!
答案 5 :(得分:0)
我能够在VS2012中与vb.net项目一致地重现/修复此问题。 在Project ...属性...编译...目标CPU设置为AnyCPU(默认)。一切正常。
将目标CPU更改为x64,保存并生成
关闭并重新打开解决方案。
您现在获得&#34;会员&#34; XXXX&#34;未被识别或无法访问&#34;错误
将目标CPU更改回任何CPU,保存并生成
窗口现在可以正常显示。
答案 6 :(得分:0)
我也有同样的例外。我的问题是,属性的类型是在程序集中,在项目中没有引用,我使用UserControl。