【问题标题】:Expression Blend doesn't recognize command objects declared in code behind fileExpression Blend 无法识别在代码隐藏文件中声明的命令对象
【发布时间】:2010-04-08 17:49:01
【问题描述】:

我有一个 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));
        }

【问题讨论】:

  • 开始赏金!趁热吃!

标签: c# wpf visual-studio-2008 expression-blend


【解决方案1】:

Expression Blend 不会加载代码隐藏。它实际上只是加载 XAML。您始终可以在 XAML 中的 UserControl.Resources 中创建 Command 对象。如果您在代码隐藏中创建了某些内容并且您的 XAML 引用了它,Expression Blend 将无法找到它,因为它只是解析 XAML。

在您说 Blend 已损坏之前,这是设计使然。命令和类似的项目应该封装在你的设计/布局逻辑中,这些逻辑应该在你的 XAML 中。如果您有自定义命令或自定义操作,在您的 XAML 中使它们可用仍然很容易。

这是我为我的应用做的:

我在 MyApp.Commands 命名空间中有一个名为 Command.cs 的 C# 类文件

public static class AppCommands
{
    public static RoutedCommand SendData { get { return _sendDataCommand; } }

    private static RoutedCommand _sendDataCommand = new RoutedCommand
    (
        "Send Data",
        typeof(AppCommands),
        new InputGestureCollection()
        {
            new KeyGesture(Key.N, ModifierKeys.Alt)
        }
    )
}

那么您的 XAML 将包括...

<UserControl x:Class="MyApp.Window"
    xmlns:c="clr-namespace:TBL.SFDC.Commands">
    <UserControl.Resources>
        <CommandBinding Command="c:AppCommands.SendData" Executed="SendData_Executed" CanExecute="SendData_CanExecute" />
    <UserControl.Resources>
</UserControl>

【讨论】:

  • 感谢您的回答,看起来很有希望。但对我来说,Blend 能够使用在不同类中定义的静态命令,但不能使用在类后面的代码中定义的静态命令,这似乎有点奇怪。有机会我会尝试并接受!
  • 在不同类中定义的静态命令已经编译。当您使用代码隐藏时,Blend 将加载 XAML 并可以精细预编译项目。它只是(奇怪的是)不会加载代码隐藏。至少它对我来说是这样的。
【解决方案2】:

在许多情况下,您必须在 BLEND 中编译您的解决方案,以使其能够识别您的类中的属性等。我遇到了同样的问题,只有当同事提醒我在 Blend 中重新编译时,我才让它工作。

【讨论】:

    【解决方案3】:

    您是否复制并粘贴了错误?如果是这样,那么看起来你在某个地方有错字。您的代码和 XAML 具有 ResetCameraCommand(命令中有两个 m),并且您的错误消息显示 ResetCameraComand(命令中有一个 m)。

    【讨论】:

    • 不,我没有复制和粘贴错误。 (Blend 不允许您选择或复制错误文本,因此这是我在发布此错误时犯的错字。)C# 或 XAML 代码中没有错字:该应用程序在 Visual Studio 中编译并正常运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 1970-01-01
    相关资源
    最近更新 更多