Expression Blend не распознает объекты команд, объявленные в коде файла - PullRequest
1 голос
/ 08 апреля 2010

У меня есть WPF UserControl. Код в файле объявляет некоторые объекты RoutedUICommand, на которые есть ссылки в XAML. Приложение собирается и работает просто отлично. Однако 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));
        }

Ответы [ 3 ]

1 голос
/ 20 апреля 2010

Expression Blend НЕ загружает код позади. На самом деле он просто загружает XAML. Вы всегда можете создать объекты Command в вашем UserControl.Resources в XAML. Если вы создадите что-то в коде позади и ваш XAML ссылается на него, Expression Blend не сможет его найти, поскольку он просто анализирует XAML.

Прежде чем вы скажете, что Blend не работает, это сделано специально. Команды и аналогичные элементы должны быть инкапсулированы в логику вашего дизайна / макета, которая должна быть в вашем XAML. Если у вас есть пользовательские команды или пользовательские действия, все еще довольно легко сделать их доступными в вашем XAML.

Вот как я это сделал для своего приложения:

У меня есть файл класса C # с именем Command.cs в пространстве имен MyApp.Commands

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>
1 голос
/ 03 марта 2011

Во многих случаях вы должны скомпилировать свое решение IN BLEND, чтобы оно распознало свойства и т. Д. Из ваших классов. У меня возникла та же проблема, и только когда коллега напомнил мне перекомпилировать в Blend, я заставил ее работать.

0 голосов
/ 08 апреля 2010

Вы скопировали и вставили ошибку? Если так, то похоже, что у вас есть опечатка где-то. Ваш код и XAML имеют ResetCameraCommand (с двумя m в команде), и ваше сообщение об ошибке говорит ResetCameraComand (с одним m в команде).

...