Expression Blend 无法识别代码隐藏文件中声明的命令对象
我有一个 WPF 用户控件。文件背后的代码声明了一些在 XAML 中引用的 RoutedUICommand 对象。该应用程序构建并运行得很好。但是,Expression Blend 3 无法在设计器中加载 XAML,并会出现如下错误:
成员“ResetCameraCommand”不是 已识别或可访问。
类和成员都是公共的。在 Blend 中构建和重建项目并重新启动 Blend 没有帮助。有什么想法吗?
这是我的 XAML 片段……
<UserControl x:Class="CAP.Visual.CameraAndLightingControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CAP.Visual;assembly=VisualApp"
Height="100" Width="700">
<UserControl.CommandBindings>
<CommandBinding Command="local:CameraAndLightingControl.ResetCameraCommand" Executed="ResetCamera_Executed" CanExecute="ResetCamera_CanExecute"/>
</UserControl.CommandBindings>
....
以及 C# 背后的代码
namespace CAP.Visual
{
public partial class CameraAndLightingControl : UserControl
{
public readonly static RoutedUICommand ResetCameraCommand;
static CameraAndLightingControl()
{
ResetCameraCommand = new RoutedUICommand("Reset Camera", "ResetCamera", typeof(CameraAndLightingControl));
}
I have a WPF UserControl. The code behind file declares some RoutedUICommand objects which are referenced in the XAML. The application builds and runs just fine. However Expression Blend 3 cannot load the XAML in the designer and gives errors like this one:
The member "ResetCameraCommand" is not
recognized or accessible.
The class and the member are both public. Building and rebuilding the project in Blend and restarting Blend hasn't helped. Any ideas what the problem is?
Here are fragments of my XAML ...
<UserControl x:Class="CAP.Visual.CameraAndLightingControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CAP.Visual;assembly=VisualApp"
Height="100" Width="700">
<UserControl.CommandBindings>
<CommandBinding Command="local:CameraAndLightingControl.ResetCameraCommand" Executed="ResetCamera_Executed" CanExecute="ResetCamera_CanExecute"/>
</UserControl.CommandBindings>
....
... and the code behind C#
namespace CAP.Visual
{
public partial class CameraAndLightingControl : UserControl
{
public readonly static RoutedUICommand ResetCameraCommand;
static CameraAndLightingControl()
{
ResetCameraCommand = new RoutedUICommand("Reset Camera", "ResetCamera", typeof(CameraAndLightingControl));
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Expression Blend 不会加载隐藏代码。它实际上只是加载 XAML。您始终可以在 XAML 中的 UserControl.Resources 中创建 Command 对象。如果您在代码隐藏中创建某些内容并且 XAML 引用它,Expression Blend 将无法找到它,因为它只是解析 XAML。
在你说 Blend 被破坏之前,这是设计使然。命令和类似的项目应该封装在您的设计/布局逻辑中,该逻辑应该位于您的 XAML 中。如果您有自定义命令或自定义操作,那么在 XAML 中使用它们仍然非常容易。
以下是我为我的应用程序执行此操作的方法:
我在 MyApp.Commands 命名空间中有一个名为 Command.cs 的 C# 类文件
然后您的 XAML 将包括...
Expression Blend does NOT load the code-behind. It actually just loads the XAML. You can always create the Command objects in your UserControl.Resources in XAML. If you create something in code-behind and your XAML references it, Expression Blend won't be able to find it since it just parses XAML.
Before you go saying Blend is broken, this is by design. Commands and similar items should be encapsulated in your design/layout logic which should be in your XAML. If you have custom Commands or custom actions, it's still pretty easy to make them available in your XAML.
Here's how I did it for my app:
I have a C# class file called Command.cs in the MyApp.Commands namespace
Then your XAML would include...
在许多情况下,您必须以混合方式编译解决方案,以使其识别类中的属性等。我遇到了同样的问题,只有当同事提醒我在 Blend 中重新编译时,我才让它工作。
In many cases you must compile your solution IN BLEND to get it to recognize properties etc. from your classes. I was having this same problem and only when a coworker reminded me to recompile in Blend did I get it to work.
您是否复制并粘贴了错误?如果是这样,那么看起来你在某个地方有错字。您的代码背后和 XAML 有 ResetCameraCommand (命令中有两个 m),并且您的错误消息显示 ResetCameraComand (命令中有 1 个 m)。
Did you copy and paste the error? If so, then it looks like you have a typo someplace. Your code behind and XAML have ResetCameraCommand (with two m's in Command), and your error message says ResetCameraComand (with one m in Command).