Задать вопрос
  • Вылетает исключение в XAML Designer. Иногда вылетает, иногда нет. Подробности в теме с картинками. Сталкивался кто?

    Casper-SC
    @Casper-SC Автор вопроса
    А этот?
    public MainViewModel Main
            {
                get
                {
                    return !ViewModelBase.IsInDesignModeStatic ?
                        _container.Resolve<MainViewModel>() :
                        _designerMainVm ?? (_designerMainVm =
                        new MainViewModel { Settings = new AppSettings() });
                }
            }
  • Вылетает исключение в XAML Designer. Иногда вылетает, иногда нет. Подробности в теме с картинками. Сталкивался кто?

    Casper-SC
    @Casper-SC Автор вопроса
    "А когда приложение у заказчика будет зверски тормозить - посоветуйте ему купить комп мощнее."
    Что вообще за бред? А как надо делать, написать 10 консольных приложений и запускать их поочереди? Всё там нормально у меня написано, всё что должно быть загружено в один момент времени, то в этот момент времени и загружено. Не все свойства инициализируются при старте приложения. Короче, для начал стоит смотреть код, а потом уже выводы делать.
  • Вылетает исключение в XAML Designer. Иногда вылетает, иногда нет. Подробности в теме с картинками. Сталкивался кто?

    Casper-SC
    @Casper-SC Автор вопроса
    Вы код вообще смотрели? Какого всего приложения? Там голый MainViewModel запускается и всё.
  • Просто убийственно тормозит XAML дизайнер после добавления Autofac. Кто-нибудь с такой проблемой сталкивался?

    Casper-SC
    @Casper-SC Автор вопроса
    Максим Ванюшкин: да, в дизайнере отрисовывается мнемосхема состоящая из огромного кол-ва таких вот мелких частей, но в MvvmLight есть встроенный SimpleIoc. Вот, к примеру:
    public class ViewModelLocator
        {
            /// <summary>
            /// Initializes a new instance of the ViewModelLocator class.
            /// </summary>
            public ViewModelLocator()
            {
                ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
    
                DispatcherHelper.Initialize();
    
                SimpleIoc.Default.Register<MainViewModel>();
            }
    
            public MainViewModel Main
            {
                get
                {
                    return ServiceLocator.Current.GetInstance<MainViewModel>();
                }
            }
            
            public static void Cleanup()
            {
                // TODO Clear the ViewModels
            }
        }


    После использования Autofac тот же самый код с небольшими изменениями начал просто сильно тормозить, а дизайнер иногда вылетать. Так же Visual Studio съедает до 1 Гб с небольшим памяти при попытке отрисовать главное окно. Раньше такого не было при том же кол-ве элементов.
  • Просто убийственно тормозит XAML дизайнер после добавления Autofac. Кто-нибудь с такой проблемой сталкивался?

    Casper-SC
    @Casper-SC Автор вопроса
    ViewModelLocator.cs
    /// <summary>
        /// This class contains static references to all the view models in the
        /// application and provides an entry point for the bindings.
        /// </summary>
        public class ViewModelLocator : ViewModelLocatorBase
        {
            private readonly IContainer _container;
            private static ViewModelLocator _locator;
    
            /// <summary>
            /// Initializes a new instance of the ViewModelLocator class.
            /// </summary>
            public ViewModelLocator()
            {
                _locator = this;
    
                if (!ViewModelBase.IsInDesignModeStatic)
                {
                    Application.Current.DispatcherUnhandledException += Current_DispatcherUnhandledException;
                    Application.Current.MainWindow.Loaded += MainWindow_Loaded;
                    Application.Current.MainWindow.Closing += MainWindow_Closing;
                }
    
                LogManager.Logger.LogPath = LocalConfiguration.Instance.Folders.Logs;
    
                DispatcherHelper.Initialize();
                CorrelationsLocator.Initialize();
    
                if (!ViewModelBase.IsInDesignModeStatic)
                {
                    ProgramIdentification.Initialize(ProgramIdentifier.CbpOperator);
    
                    LocalConfiguration.Instance.Folders.CheckFolders();
                    LocalConfiguration.Instance.LoadAppConfig();
                    LocalConfiguration.Instance.LoadLocalSettings();
    
                    WpfSingleInstance.AppIsAlreadyRunning += (sender, args) =>
                        MessageBox.Show(string.Format("Приложение: {0} уже запущено", args.AppName));
                    WpfSingleInstance.Make();
                }
                //if (ViewModelBase.IsInDesignModeStatic)
                //{
                //    return;
                //}
                _container = RegisterDependencies(LocalConfiguration.Instance);
            }
    
            /// <summary>
            /// Зарегистрировать зависимости
            /// </summary>
            /// <param name="config">Локальная конфигурация программы</param>
            /// <returns></returns>
            private IContainer RegisterDependencies(LocalConfiguration config)
            {
                var builder = new ContainerBuilder();
    
                builder.RegisterType<LauncherViewModel>().SingleInstance();
                builder.RegisterType<ShutdownViewModel>().SingleInstance();
                builder.RegisterType<CommandManager>().SingleInstance();
                builder.RegisterType<AccountControllerVm>().SingleInstance();
                builder.RegisterType<ComponentEditorViewModel>().SingleInstance();
                builder.RegisterType<ComponentSelectorViewModel>().SingleInstance();
                builder.RegisterType<RecipeTimeSetEditorViewModel>().SingleInstance();
                builder.RegisterType<CategoryEditorViewModel>().SingleInstance();
                builder.RegisterType<AboutDialogViewModel>().SingleInstance();
                builder.RegisterType<L1ApplicationManagerViewModel>().SingleInstance();
    
                builder.RegisterType<CarEditorViewModel>() //Редактор машин
                    .OnActivated(e =>
                    {
                        e.Instance.WindowSettings = config.Settings.CarsWindowSettings; //Настройки окна (положение, размер, состояние)
                    }).SingleInstance();
    
                builder.RegisterType<ClientsEditorViewModel>() //Редактор клиентов
                    .OnActivated(e =>
                    {
                        e.Instance.WindowSettings = config.Settings.ClientsWindowSettings; //Настройки окна (положение, размер, состояние)
                    }).SingleInstance();
    
                builder.RegisterType<ReportsWindowViewModel>() //Отчёты
                    .OnActivated(e =>
                    {
                        e.Instance.WindowSettings = config.Settings.ReportsWindowSettings; //Настройки окна (положение, размер, состояние)
                        e.Instance.ReportsFolder = config.Folders.Documents;
                        e.Instance.ReportMode = ReportMode.Applications;
                    });
    
                builder.RegisterType<EventLogViewModel>() //Журнал событий
                    .OnActivated(e =>
                    {
                        e.Instance.WindowSettings = config.Settings.EventLogWindowSettings; //Настройки окна (положение, размер, состояние)
                        e.Instance.SetConfiguration(config.Config, config.Folders.EventReportFolder);
                    });
    
                builder.RegisterType<RecipesEditorViewModel>() //Редактор рецептов
                    .OnActivated(e =>
                    {
                        e.Instance.WindowSettings = config.Settings.RecipeWindowSettings; //Настройки окна (положение, размер, состояние)
                        e.Instance.SetEditorSettings(config.Settings.RecipeEditorConfig);
                    })
                    .SingleInstance();
    
                builder.RegisterType<ApplicationsEditorViewModel>() //Редактор заявок
                    .OnActivated(e =>
                    {
                        e.Instance.LastSelectedItems = config.Settings.LastSelectedItemsInAppWindow; //Состояние последних выбранных элементов.
                        e.Instance.WindowSettings = config.Settings.AppEditorWindowSettings;
                    })
                    .SingleInstance();
    
                builder.RegisterType<MainViewModel>() 
                    .OnActivated(e =>
                    {
                        var appManager = e.Context.Resolve<L1ApplicationManagerViewModel>();
                        appManager.Main = e.Instance;
                        if (!ViewModelBase.IsInDesignModeStatic)
                        {
                            e.Instance.Title = ProgramIdentification.GetCurrentProgramName();
                        }
                        e.Instance.Settings = config.Settings.ApplicationSettings;
                    })
                    .SingleInstance();
    
                return builder.Build();
            }
    
            private void MainWindow_Loaded(object sender, RoutedEventArgs e)
            {
                WindowManager.Instance.Initialize(Application.Current.MainWindow, Main);
                Main.OnWindowLoaded();
            }
    
            private void MainWindow_Closing(object sender, CancelEventArgs e)
            {
                Debug.WriteLine("Начало: MainWindow_Closing");
                Window window = (Window)sender;
    
                Debug.WriteLine("Конец: MainWindow_Closing");
    
                if (WindowManager.Instance.OpenMessageDialog(DialogIcons.Help, DialogButtons.YesNo,
                    "Выход из программы",
                    "Вы действительно хотите завершить работу приложения?") == UserDialogResult.No)
                    e.Cancel = true;
                else
                {
                    window.Closing -= MainWindow_Closing;
                    try
                    {
                        LocalConfiguration.Instance.SaveLocalSettings();
                        LocalConfiguration.Instance.SaveCurrentAppConfig();
                    }
                    catch (Exception ex)
                    {
                        LogManager.Logger.AppendException(ex);
                    }
                }
            }
    
            private void Current_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
            {
                LogManager.Logger.AppendException(e.Exception);
                MessageBox.Show(e.Exception.ToString());
            }
    
            #region Свойства
    
            public static ViewModelLocator Current
            {
                get { return _locator; }
            }
    
            public MainViewModel Main
            {
                get { return _container.Resolve<MainViewModel>(); }
            }
    
            public L1ApplicationManagerViewModel ApplicationsManager
            {
                get { return _container.Resolve<L1ApplicationManagerViewModel>(); }
            }
    
            public AccountControllerVm AccountController
            {
                get { return _container.Resolve<AccountControllerVm>(); }
            }
    
            public ShutdownViewModel Shutdown
            {
                get { return _container.Resolve<ShutdownViewModel>(); }
            }
    
            public CategoryEditorViewModel CategoryEditor
            {
                get { return _container.Resolve<CategoryEditorViewModel>(); }
            }
    
            public ApplicationsEditorViewModel ApplicationsEditor
            {
                get { return _container.Resolve<ApplicationsEditorViewModel>(); }
            }
    
            public RecipesEditorViewModel RecipesEditor
            {
                get { return _container.Resolve<RecipesEditorViewModel>(); }
            }
    
            public ComponentEditorViewModel ComponentEditor
            {
                get { return _container.Resolve<ComponentEditorViewModel>(); }
            }
    
            public ComponentSelectorViewModel ComponentsSelector
            {
                get { return _container.Resolve<ComponentSelectorViewModel>(); }
            }
    
            /// <summary>Редактор клиентов</summary>
            public ClientsEditorViewModel ClientsEditor
            {
                get { return _container.Resolve<ClientsEditorViewModel>(); }
            }
    
            public CarEditorViewModel CarsEditor
            {
                get { return _container.Resolve<CarEditorViewModel>(); }
            }
    
            public CommandManager CommonCommands
            {
                get { return _container.Resolve<CommandManager>(); }
            }
    
            public LauncherViewModel Launcher
            {
                get { return _container.Resolve<LauncherViewModel>(); }
            }
    
            public AboutDialogViewModel About
            {
                get { return _container.Resolve<AboutDialogViewModel>(); }
            }
    
            /// <summary>
            /// Возвращает новый экземпляр модели представления Отчётов
            /// </summary>
            public ReportsWindowViewModel NewReport
            {
                get { return _container.Resolve<ReportsWindowViewModel>(); }
            }
    
            /// <summary>
            /// Возвращает новый экземпляр модели представления Журнала событий
            /// </summary>
            public EventLogViewModel NewEventLog
            {
                get { return _container.Resolve<EventLogViewModel>(); }
            }
    
    
            #endregion
    
            #region Методы
    
    
            #endregion
        }
  • Как запретить остановку программы?

    Алексей: то есть вводим данные в фильтры и через какое-то время отправляется по ним запрос? Я просто такое писал, и у меня просто, когда печатаешь с задержкой запрос отправляется, если после нажатия клавиши 500 мс прошло, то пошёл запрос, если снова нажали, отмена запроса, новое ожидание, новый запрос.
  • Как правильно написать на MVVM?

    Михаил: что хочешь увидеть? Желательно что-то не сильно большое, чтобы это можно было быстро сделать. Так-то могу многое просто скопировать частично в новый проект и довольно быстро сделать новый, но всё же, что именно тебе непонятно и что интересует?

    Лично как думаю я, тебе нужно знать, что есть локатор вью моделей (ViewModelLocator), в нём содержатся нужные вью модели. Можно настроить свойства этого класса так, чтобы при обращении они/оно возвращали всегда один и тот же экземпляр вью модели или каждое обращение новый. Либо можно создать лишь реально долгоживущую вью модель в локаторе, а остальные создавать внутри кода других вью моделей уже по мере создания каких-то объектов, которые требуют вью модель. Ну или вью модель может быть изначально в свойстве DataContext какой-то вью. Возможно сейчас ты ничего не понял, но когда попробуешь что-то писать, то вернись к этому тексту, постепенно придёт понимание о чём я говорю.

    Как устроен MVVM.
    Model - классы модели, то есть бизнес логика и какие-то классы, к примеру DTO (data Transfer Object), с помощью которых можно обмениваться данными через WCF. Сериализовали объект на сервере, передали данные в виде XML, десериализовали на клиенте, вот это DTO.

    ViewModel - логика самого приложения и, например, обёртки над DTO классами, которые умеют уведомлять UI о изменении какого-то свойства в DTO классе. В простом случае это просто копия DTO класса, но внутри этой "копии" находится экземпляр класса DTO, а обёртка оборачивает его свойства своими и дополнительно вызывает реализацию INotifyPropertyChanged. Без примеров кода не совсем ясно, но в будущем должен понять, что я тут имею ввиду.

    View - окна, элементы управления, в общем, вся UI часть.

    Как всё взаимодействует. View знает о ViewModel, ViewModel знает о Model, но не наоборот.
    View обновляет свои данные посредством биндингов и вызывая методы вью модели внутри CodeBehind вьюшки. Но нельзя передавать во ViewModel на что-то из View, ведь ViewModel ничего не знает о View.

    Зачем всё вообще это нужно? Во-первых написав нормально рабочую ViewModel можно легко заменить View не трогая ViewModel, в хорошем случае. Либо для одной ViewModel можно написать много разных View и в зависимости от своих каких-то условий подставлять нужный VIew. Так же такое разделение позволяет легко тестировать ViewModel в юнит тестах, так как она вообще никак не связана с View. Короче, поверь, одни плюсы. Я уже не раз убедился, что на работе все новые проекты используют MVVM.
  • Как отловить момент, когда окно помещается в одну из сторон экрана (прилипает как бы), при нажатии WIN + LEFT?

    Casper-SC
    @Casper-SC Автор вопроса
    Спасибо. Это интересно. А не подскажите, где можно об этом почитать? У меня есть какая-то книга по Win API, но не факт, что там есть эта информация. Или может толковую книгу подскажите?
  • Нестандартное окно разворачивается на весь экран. То есть закрывая собой панель задач. Как исправить?

    Casper-SC
    @Casper-SC Автор вопроса
    Александр А: в смысле учитывать? Меняешь свойство на Maximized и окно само должно же принимать нужный размер. Или это работает только, если у окна есть рамка, которой у меня нет.
  • Книги для изучения C++/C#

    Ну и бред. Ничего выворачивающего разум наизнанку в ООП не вижу, хотя занимаюсь несколько лет программированием на C# + всякие там WPF, WCF.