С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/55: Рейтинг темы: голосов - 55, средняя оценка - 4.67
управление сложностью
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
1

Архитектура MVVM в многооконном приложении

17.04.2018, 14:22. Показов 10158. Ответов 38
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую, ребята. Подскажите пожалуйста, кто как проектирует MVVM при использовании нескольких окон в приложении ?
На "метаните" читал, но там без MVVM (по сути, как в WinForms)

Добавлено через 31 минуту
нашел парочку тем:
MVVM и открытие другого View
Открытие одной формы из другой
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.04.2018, 14:22
Ответы с готовыми решениями:

Управление окнами в многооконном приложении
Я сейчас делаю проект с очень большим количеством форм. И мне надо сделать чтобы формы открывались...

MVVM в многовкладочном приложении
Добрый день! В моем приложении много вкладок. По сути это различные блоки одной целой программы....

Архитектура для сетевого взаимодействия в приложении
Всем новогодний привет!)) Хотел бы поинтересоваться, как кто предпочитает организовывать у себя...

В указанном dsn архитектура драйвера и архитектура приложения не соответствуют друг другу
Добрый день. При запуске программы выскакивает вот такая вот ошибка. В чем может быть проблема и...

38
Эксперт .NET
1847 / 1354 / 428
Регистрация: 10.06.2011
Сообщений: 2,128
17.04.2018, 14:23 2
Цитата Сообщение от Почтальон Посмотреть сообщение
На "метаните" читал, но там без MVVM (по сути, как в WinForms)
Ерунда
Вот пример реализации отображения дочерних окон с применением MVVM
2
управление сложностью
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
17.04.2018, 14:40  [ТС] 3
novikov.ea, премного благодарен, пойду курить
0
управление сложностью
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
22.04.2018, 12:17  [ТС] 4
novikov.ea, наконец-то руки дошли "покурить". Но это немного не то. Дело в том, что в вашем примере, каждый раз создается дочернее окно, при щелчке по кнопке. Это не совсем то, что необходимо.
Нашел вот такой пример, по сути, работает как открытие модального окна.
MVVM_OpenNewWindowMinimalExample-master.7z
Осталось только разобраться что к чему...
0
Эксперт .NET
1847 / 1354 / 428
Регистрация: 10.06.2011
Сообщений: 2,128
22.04.2018, 12:31 5
Цитата Сообщение от Почтальон Посмотреть сообщение
Дело в том, что в вашем примере, каждый раз создается дочернее окно, при щелчке по кнопке. Это не совсем то, что необходимо.
Так просто исправьте код в DialogManager. Вместо window.Show вызывайте window.ShowDialog, и будет модальное окно
0
управление сложностью
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
22.04.2018, 16:16  [ТС] 6
Цитата Сообщение от novikov.ea Посмотреть сообщение
Так просто исправьте код
Если вас зовут Алексей Лосев, то я читал ваш блог

Добавлено через 1 час 5 минут
т.е. по сути, в приложении должно открыться дочернее окно, добавленное в проект
0
Эксперт .NET
1847 / 1354 / 428
Регистрация: 10.06.2011
Сообщений: 2,128
22.04.2018, 23:53 7
Цитата Сообщение от Почтальон Посмотреть сообщение
Если вас зовут Алексей Лосев
Нет, вы ошиблись. По моему логину можно понять, что у меня другая фамилия)
0
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
23.04.2018, 16:26 8
Приветствую ребята! Прошу прощения что влез со своими граблями, только ради того, что бы не плодить темы. Да и сабж похож. Есть два окна (MainWindow и SecondWindow). На мейн экране кнопка. Нажав на нее нужно открыть окно и изменить запись со "Старт" на "Стоп". После закрытия снова изменить контент кнопки на "Старт". Делаю на MVVM + реализация интерфейса
ICommand
Сейчас у меня выходит запустить второе окно и изменить текст, но при закрытии окна не знаю, как снова надпись на кнопке изменить и при нажатии можно сколь угодно окон открыть. А мне нужно что бы открывалось окно один раз, пока не закроем, вызывать его запрещено. Не могу понять где флажки поставить.
Кликните здесь для просмотра всего текста

Мейн морда
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<Window x:Class="CommandMVVM.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:CommandMVVM"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.Resources>
        <local:MainWindowViewModel x:Key="MainWindowViewModel" />
    </Window.Resources>
    <Grid DataContext="{StaticResource MainWindowViewModel}">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
 
        <Button Name="v_Button_ToggleNextWindow" Grid.Row="1" Command="{Binding StartStopCommand, Mode=OneTime}"  
                VerticalAlignment="Center" HorizontalAlignment="Center" Width="90">
            <Button.Content>
                <TextBlock Text="{Binding ButtonContent}" />
            </Button.Content>
        </Button>
 
    </Grid>
</Window>
Класс оповещения вью
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  public abstract class NotificationObject : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
 
        protected virtual void NotifyPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
 
        protected void SetField<T>(ref T field, T value, [CallerMemberName] string propertyName = null)
        {
            if (!EqualityComparer<T>.Default.Equals(field, value))
            {
                field = value;
                NotifyPropertyChanged(propertyName);
            }
        }
    }
Класс реализации интерфеса комманды
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  public class RelayCommand : ICommand
    {
        Action _targetExecuteMethod;
        Func<bool> _targetCanExecuteMethod;
 
        public RelayCommand(Action executeMethod)
        {
            _targetExecuteMethod = executeMethod;
        }
 
        public RelayCommand(Action executeMethod, Func<bool> canExecuteMethod)
        {
            _targetExecuteMethod = executeMethod;
            _targetCanExecuteMethod = canExecuteMethod;
        }
 
        public void RaiseCanExecuteChanged()
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }
        #region ICommand Members
 
        bool ICommand.CanExecute(object parameter)
        {
            if (_targetCanExecuteMethod != null)
            {
                return _targetCanExecuteMethod();
            }
            if (_targetExecuteMethod != null)
            {
                return true;
            }
            return false;
        }
 
        // Beware - should use weak references if command instance lifetime is longer than lifetime
        // of UI objects that get hooked up to command
        // Prism commands solve this in their implementation
        public event EventHandler CanExecuteChanged = delegate { };
 
        void ICommand.Execute(object parameter)
        {
            if (_targetExecuteMethod != null)
            {
                _targetExecuteMethod();
            }
        }
        #endregion
    }
 
    public class RelayCommand<T> : ICommand
    {
        Action<T> _targetExecuteMethod;
        Func<T, bool> _targetCanExecuteMethod;
 
        public RelayCommand(Action<T> executeMethod)
        {
            _targetExecuteMethod = executeMethod;
        }
 
        public RelayCommand(Action<T> executeMethod, Func<T, bool> canExecuteMethod)
        {
            _targetExecuteMethod = executeMethod;
            _targetCanExecuteMethod = canExecuteMethod;
        }
 
        public void RaiseCanExecuteChanged()
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }
        #region ICommand Members
 
        bool ICommand.CanExecute(object parameter)
        {
            if (_targetCanExecuteMethod != null)
            {
                T tparm = (T)parameter;
                return _targetCanExecuteMethod(tparm);
            }
            if (_targetExecuteMethod != null)
            {
                return true;
            }
            return false;
        }
 
        // Beware - should use weak references if command instance lifetime is longer than lifetime of 
        // UI objects that get hooked up to command
        // Prism commands solve this in their implementation
        public event EventHandler CanExecuteChanged = delegate { };
 
        void ICommand.Execute(object parameter)
        {
            if (_targetExecuteMethod != null)
            {
                _targetExecuteMethod((T)parameter);
            }
        }
        #endregion
    }
Вьюмодель основной морды
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
 public class MainWindowViewModel : NotificationObject
    {
        SecondWindow rg; 
 
        /// <summary>
        /// Комманда для кнопки открывающей второе вью
        /// </summary>
        //private ICommand _toggleSecondViewCommand;
        //public ICommand ToggleSecondViewCommand
        //{
        //    get
        //    {
        //        return _toggleSecondViewCommand;
        //    }
 
        //    private set { }
        //}
 
        /// <summary>
        /// Надпись на кнопке
        /// </summary>
        private string _buttonContent;
        public string ButtonContent
        {
            get => _buttonContent;
            set
            {
                _buttonContent = value;
                NotifyPropertyChanged("ButtonContent");
            }
        }
 
        /// <summary>
        /// Флаг 
        /// </summary>
        private bool _IsRunning;
        public bool IsRunning
        {
            get => _IsRunning;
            set
            {
                _IsRunning = value;
                //обновление кнопки
                StartStopCommand.RaiseCanExecuteChanged();
            }
        }
 
 
        /// <summary>
        /// Кнопка запуска и останова
        /// </summary>
        private RelayCommand _StartStopCommand;
        public RelayCommand StartStopCommand
        {
            // get {return }
            get => _StartStopCommand = _StartStopCommand ?? new RelayCommand(ToggleSecondViewExecute, CanStartStop);
        }
 
        /// <summary>
        ///.ctor 
        /// </summary>
        public MainWindowViewModel()
        {
            //InitializeCommands();
        }
 
        /// <summary>
        /// Start/Stop flag
        /// </summary>
        /// <returns></returns>
        private bool CanStartStop()
        {
            if (IsRunning)
            {
                ButtonContent = "Стоп";
            }
            else
            {
                ButtonContent = "Старт";
            }
 
            return true;
        }
 
 
        private void ToggleSecondViewExecute()
        {
            Boolean windowOpened = false;
 
            if (IsRunning && rg != null)
            {
                IsRunning = false;
            }
            
            else
            {
                if (!windowOpened)
                {
 
                    windowOpened = true;
                    IsRunning = true;
                    rg = new SecondWindow();
                    rg.Show();
                    Debug.WriteLine($"IsRunning = {IsRunning} ButtonContent = {ButtonContent}");
                }
             }
        }
 
        // Deprecated
        //private void InitializeCommands()
        //{
        //    _toggleSecondViewCommand = new RelayCommand(ToggleSecondViewExecute);
        //}
    }
Вторая вью модель пока пуста.
0
Эксперт .NET
1847 / 1354 / 428
Регистрация: 10.06.2011
Сообщений: 2,128
23.04.2018, 16:42 9
Цитата Сообщение от Jman Посмотреть сообщение
А мне нужно что бы открывалось окно один раз, пока не закроем
....
Цитата Сообщение от novikov.ea Посмотреть сообщение
Вместо window.Show вызывайте window.ShowDialog, и будет модальное окно
0
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
23.04.2018, 16:45 10
А зачем модальное окно? Полноценное окно мне бы. Да и кнопка даже с модальным окном при закрытии не дергает событие и не меняет контент.
0
Эксперт .NET
1847 / 1354 / 428
Регистрация: 10.06.2011
Сообщений: 2,128
23.04.2018, 17:54 11
Тогда на кнопку, которая открывает окно нужно повесить команду, CanExecute которой будет возвращать false, если окно уже открыто и true, если не открыто.
0
управление сложностью
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
23.04.2018, 20:25  [ТС] 12
А может ну его..., этот паттерн , я все больше склоняюсь к тому, что он был "изобретен" в угоду дизайнерам
0
Эксперт .NET
1847 / 1354 / 428
Регистрация: 10.06.2011
Сообщений: 2,128
23.04.2018, 23:41 13
Почтальон, вы вольны сделать так, как захотите. Лично мне паттерн нравится.
1
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
23.04.2018, 23:51 14
Нужно поставить NuGet пакет MvvmLight. Я перед заливкой удалил, но что-то автоматом он у меня после этого не восстанавливается. ДУмаю, кому нужно, тот разберётся.

Вот посидел, набросал. Сразу скажу, нет особого желания пилить это дело, вроде получилось более-менее. Там кому нужно додумает, мне пока не нужно, но было интересно попробовать это дело заставить работать и не обращаться напрямую к окнам во ViewModel.

Если есть предложения по архитектуре, то послушал бы. DialogManager особо не тестил, взял его по ссылке с этого форума и чуть изменил, я подобное уже сам писал, второй раз лень было ))

Jman, собственно работает так, как ты и хотел.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
 
namespace WpfMvvm_OpeningTheWindows.ViewModels
{
    public class MainViewModel : ViewModelBase
    {
        private readonly IDialogManager _dialogManager;
        private string _buttonContent;
        private IViewContainer _container;
 
        public MainViewModel(IDialogManager dialogManager)
        {
            StartStopContent = "Start";
 
            _dialogManager = dialogManager;
            StartStopCommand = new RelayCommand(StartStop);
        }
 
        private void StartStop()
        {
            if (!IsOpened)
            {
                var key = typeof(SecondViewModel).FullName;
                var container = _dialogManager.GetViewContainer(key, new SecondViewModel("Test"));
 
                container.ViewClosed += Container_ViewClosed;
                container.ViewLoaded += Container_ViewLoaded;
                container.Show();
                _container = container;
            }
            else
            {
                _container.Close();
                _container = null;
            }
        }
 
        private void Container_ViewLoaded(object sender, object e)
        {
            var container = (IViewContainer)sender;
            container.ViewLoaded -= Container_ViewLoaded;
 
            StartStopContent = "Stop";
        }
 
        private void Container_ViewClosed(object sender, object e)
        {
            var container = (IViewContainer) sender;
            container.ViewClosed -= Container_ViewClosed;
 
            StartStopContent = "Start";
        }
 
        public RelayCommand StartStopCommand { get; private set; }
 
        public string StartStopContent
        {
            get { return _buttonContent; }
            set
            {
                _buttonContent = value;
                RaisePropertyChanged();
            }
        }
 
        public bool IsOpened
        {
            get { return _container != null; }
        }
    }
}
C#
1
2
3
4
5
6
7
8
9
10
    public interface IViewContainer
    {
        event EventHandler<object> ViewClosed;
 
        event EventHandler<object> ViewLoaded;
 
        void Close();
 
        void Show();
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Windows;
using WpfMvvm_OpeningTheWindows.ViewModels;
 
namespace WpfMvvm_OpeningTheWindows.Views
{
    public class WindowContainer : IViewContainer
    {
        private readonly Window _window;
 
        public WindowContainer(Window window)
        {
            _window = window;
            window.Closed += Window_Closed;
            window.Loaded += Window_Loaded;
        }
 
        private void Window_Closed(object sender, EventArgs e)
        {
            _window.Closed -= Window_Closed;
            OnViewClosed(_window.DataContext);
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            _window.Loaded -= Window_Loaded;
            OnViewLoaded(_window.DataContext);
        }
 
        public event EventHandler<object> ViewClosed;
 
        public event EventHandler<object> ViewLoaded;
 
        public void Close()
        {
            _window.Close();
        }
 
        public void Show()
        {
            _window.Show();
        }
 
        protected void OnViewClosed(object viewModel)
        {
            ViewClosed?.Invoke(this, viewModel);
        }
 
        protected void OnViewLoaded(object viewModel)
        {
            ViewLoaded?.Invoke(this, viewModel);
        }
    }
}
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
  In App.xaml:
  <Application.Resources>
      <vm:ViewModelLocator xmlns:vm="clr-namespace:WpfMvvm_OpeningTheWindows"
                           x:Key="Locator" />
  </Application.Resources>
  
  In the View:
  DataContext="{Binding Source={StaticResource Locator}, Path=ViewModelName}"
 
  You can also use Blend to do all this with the tool's support.
  See http://www.galasoft.ch/mvvm
*/
 
using System;
using CommonServiceLocator;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Ioc;
using WpfMvvm_OpeningTheWindows.Views;
 
namespace WpfMvvm_OpeningTheWindows.ViewModels
{
    /// <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
    {
        private MainViewModel _designerMainVm;
 
        /// <summary>
        /// Initializes a new instance of the ViewModelLocator class.
        /// </summary>
        public ViewModelLocator()
        {
            if (ViewModelBase.IsInDesignModeStatic)
            {
                return;
            }
 
            ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
 
            SimpleIoc.Default.Register<IDialogManager>(() =>
            {
                var dialogManager = new DialogManager();
                dialogManager.RegisterWindow<SecondViewModel, SecondWindow>();
                return dialogManager;
            });
 
            SimpleIoc.Default.Register<MainViewModel>();
        }
 
        public MainViewModel Main
        {
            get
            {
                return !ViewModelBase.IsInDesignModeStatic ?
                    ServiceLocator.Current.GetInstance<MainViewModel>() :
                    _designerMainVm ?? (_designerMainVm = new MainViewModel(new DialogManager()));
            }
        }
 
        public static void Cleanup()
        {
            // TODO Clear the ViewModels
        }
    }
}
Вложения
Тип файла: zip WpfMvvm_OpeningTheWindows.zip (425.7 Кб, 28 просмотров)
1
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
24.04.2018, 00:00 15
Кстати, я уже вижу минус. Регистрируется окно с указанием типа вью модели, а при получении контенера нужно знать внутреннюю реализацию DialogManager(а), чтобы получить доступ по ключу. Это можно допилить.
0
управление сложностью
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
24.04.2018, 07:28  [ТС] 16
Цитата Сообщение от novikov.ea Посмотреть сообщение
Почтальон, вы вольны сделать так, как захотите. Лично мне паттерн нравится.
Так я и не спорю, что в долгосрочной перспективе в любом случае паттерны выигрывают, только как-то сложновато разобраться новичку.
0
Эксперт .NET
1847 / 1354 / 428
Регистрация: 10.06.2011
Сообщений: 2,128
24.04.2018, 09:39 17
Согласен, в начале пути всегда встречается много сложностей. В любом случае, я предоставил вам пример рабочего варианта реализации. Вы можете использовать его, если захотите.
1
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
24.04.2018, 09:42 18
Спасибо ребят! Мда... Меня все отговаривают от этого паттерна. Но я не сдамся =)
0
Эксперт .NET
4432 / 2092 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
24.04.2018, 10:23 19
Цитата Сообщение от Jman Посмотреть сообщение
Спасибо ребят! Мда... Меня все отговаривают от этого паттерна. Но я не сдамся =)
Если в будущем планирует человек работать программистом и иметь дело с WPF/UWP, то могут отговаривать, а знать его и уметь использовать будет нужно. Например, на моей новой работе MVVM используется в уже написанных проектах, думаю, что умение писать с использованием MVVM явно не помешает.

Добавлено через 1 минуту
Я видел проекты, написанные без MVVM, это такое УГ, что просто нет желания с этим работать. Возможно, что это проблема конкретной реализации этих проектов. Немного напряжно смотреть на мешанину из обращений к контролам и логики. Как ни крути, но они будут иногда перемешиваться.
0
Эксперт .NET
1847 / 1354 / 428
Регистрация: 10.06.2011
Сообщений: 2,128
24.04.2018, 10:35 20
Цитата Сообщение от Casper-SC Посмотреть сообщение
Как ни крути, но они будут иногда перемешиваться
Такое возможно, если программист не нашёл решения, как этого можно избежать. Бывают ситуации, когда нужно пораскинуть мозгами, чтобы не нарушать уровни абстракции. В основном всё решается использованием Interaction.Triggers или Interaction.Behaviors. И MVVM остаётся чистеньким.
1
24.04.2018, 10:35
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.04.2018, 10:35
Помогаю со студенческими работами здесь

архитектура процессоров и компьютерная архитектура,Intel32. для первокурсников
сабж. кто чем может помочь юному,непонемающему в этой области человеку.желательно книгами.спасибо.

Время простоя в статус баре в многооконном текстовом редакторе
Помогите реализовать время простоя приложения в много оконном текстовом редакторе. Проблема...

Ошибка "в указанном dsn архитектура драйвера и архитектура приложения"
Вот такая ошибка при нажатии на кнопку &quot;Проверить соединение&quot; Я прочитал, что это возможно из за...

Код который работает в консольном приложении в приложении Windows Forms выдает ошибку
Есть код для записи видео с экрана. В консольном приложении он работает, записывает все как нужно....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как проводить научные вычисления на Python
InfoMaster 15.01.2025
Python стал одним из наиболее востребованных языков программирования в области научных вычислений благодаря своей простоте, гибкости и обширной экосистеме специализированных библиотек. Научные. . .
Создание игры типа Minecraft на PyGame/Python: пошаговое руководство
InfoMaster 15.01.2025
В данном руководстве мы рассмотрим процесс создания игры в стиле Minecraft с использованием библиотеки PyGame на языке программирования Python. Этот проект идеально подходит как для начинающих. . .
Как создать свою первую игру в стиле Doom на Unreal Engine
InfoMaster 15.01.2025
Разработка шутера от первого лица в стиле классического Doom представляет собой увлекательное путешествие в мир игрового программирования, где сочетаются творческий подход и технические навыки. . . .
Параллельное программировани­е: основные технологии и принципы
InfoMaster 15.01.2025
Введение в параллельное программирование Параллельное программирование представляет собой фундаментальный подход к разработке программного обеспечения, который позволяет одновременно выполнять. . .
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru