Данные времени проектирования в WPF - PullRequest
8 голосов
/ 17 января 2011

[использование vs2010 и выражение blend v4]

Привет - попытка загрузить некоторые данные времени проектирования в WPF и Blend, используя концепцию Джоша Смита здесь: http://joshsmithonwpf.wordpress.com/2010/04/07/assembly-level-initialization-at-design-time/ например,

[AttributeUsage(AttributeTargets.Assembly)]
public class DesignTimeBootstrapperAttribute : Attribute
{
    public DesignTimeBootstrapperAttribute(Type type)
    {
        var dep = new DependencyObject();
        Debug.WriteLine("here..?");
        if (DesignerProperties.GetIsInDesignMode(dep))
        {
            // TODO: Design-time initialization…
            IBootstrapper instance = Activator.CreateInstance(type) as IBootstrapper;
            if (instance != null)
            {
                instance.Run();
            }
        }
    }
}

С моим атрибутом здесь, в AssemblyInfo.cs, где AppBootstrapper расширяет MefBootstrapper.

[assembly: AssemblyCopyright("Copyright ©  2010")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
[assembly: DesignTimeBootstrapper(typeof(AppBootstrapper))]

Я не хочу использовать пример данных Blend, а) поскольку он не создает данныедля ObservableCollection и b) я по определению нахожусь в режиме разработки, поэтому многое изменится, но мои «сгенерированные данные» не изменятся.

В любом случае, похоже, ничего не происходит.

В1: Как можно отладить инициализацию времени разработки моего загрузчика?Вопрос 2: Нужны ли мне дополнительные пространства имен / атрибуты смешивания и т. Д. В моем View XAML?

(В моем загрузчике я просто регистрирую другой модуль, в котором я хочу заменить RunTimeService на DesignTimeService, экспортируя интерфейс IService).

TIA

1 Ответ

3 голосов
/ 19 января 2011

Для отладки:

  • Откройте ваш проект в VS2010
  • Установите точку останова в конструкторе атрибута сборки
  • Запустите новый экземпляр Blend 4
  • В VS2010 используйте Debug -> Attach to Process: и выберите Blend
  • Переключитесь в Blend и откройте ваш проект
  • Откройте файл XAML, который ссылается на ваши данные образца

Кроме того, в окне вывода VS2010 должен появиться любой Debug.WriteLine.

Если вы не можете заставить работать метод атрибута (я сам не пробовал), вы можете использовать этот метод(который я использовал) от MVVM Light :

private bool? _isInDesignMode;

public bool IsInDesignMode
{
    get
    {
        if (!_isInDesignMode.HasValue)
        {
            var prop = DesignerProperties.IsInDesignModeProperty;
            _isInDesignMode =
                (bool)DependencyPropertyDescriptor
                .FromProperty(prop, typeof(FrameworkElement))
                .Metadata.DefaultValue;
        }

        return _isInDesignMode.Value;
    }
}
...