• Как сделать чтобы при нажатии кнопки появлялась новая панель?

    HemulGM
    @HemulGM
    Delphi Developer, сис. админ
    Может для начала стоит почитать что-нибудь или пройти видеокурсы?
    Понимаете, какая пропасть между "мультиплеерный шутер" и "хочу чтоб появлялась панелька"?
    Ответ написан
  • Сложен ли переход с python на c#?

    Collin
    @Collin
    Если вы хорошо освоили принципы объектного программирования, поняли, что такое ООП, знаете основные конструкции общие для всех языков -- совсем не сложно.

    Для вас изменится синтаксис (к примеру циклов for и прч базовых штук), но смысл останется тем же. Плюс C# строго типизированный язык, добро пожаловать в адекватное и комфортное программирование.
    Справка по языку на русском даже есть полноценная, на том же msdn. Среда разработки очень удобная.

    Тут вопрос больше не в сложности перехода (потому что изучить новый язык, имея опыт -- не сложно), а вопрос инструментария. Для каких целей и задач вы рассматриваете переход на .net framework (.net core); так ли вам нужна эта замена Python; решит ли конкретно ваши задачи этот переход.

    Если уж куда и переходить с Python, то на C, что бы писать более производительный код и оборачивать его в Python код. А так, при переходе с Python на C# вы перейдете с высокоуровневого языка на высокоуровневый. Масло маслянное.
    Ответ написан
  • Как получить значение checkboxa из шаблона Listboxa?

    @WinnerIT
    Программист и фотограф-любитель
    состояние CheckBox у Вас хранится в IsCalc.
    Если Вы хотите запись по изминению значения IsCalc, то это делается в set:
    bool _isCalculated;
    public bool IsCalc 
    get
    {
      return _isCalculated;
    }
     set{
       if (value != _isCalculated)
    {
       _isCalculated = value;
     SaveMeInDbMethod(_isCaluclated);
     // TODO: посмотреть в гугл NotifyPropertyChanged или RaisePropertyChanged() в VievModel
     NotifyPropertyChanged("IsCalc");
     }


    Если Вы хотите по клику на CheckBox, то ищите в гугл как привязать Command к EventTrgger. На пример.
    Ответ написан
  • Как обратиться к элементу MainWindow из кода страницы (Page) WPF?

    petermzg
    @petermzg
    Самый лучший программист
    Самый простой способ добраться до MainWindow это:
    Application.Current.MainWindow
    Но все зависит от шаблона проектирования вашего приложения, для примера при MVVM могут быть и другие решения.
    Ответ написан
  • Ошибка при добавлении новой строки с таким же названием?

    Collin
    @Collin
    Загружаем данные:
    Предварительно заведем два глобальных поля (можно и лучше это делать через свойство, но сделаем попроще)
    DataSet dataSet = new DataSet();
    string filePath = Application.StartupPath + "\\dataset.xml";


    private void Form1_Shown(object sender, EventArgs e)
    {
    	// Проверяем наличие файла, если на месте, то загружаем из него наш dataSet
    	if (File.Exists(filePath))
    	{
    		dataSet.ReadXml(filePath);
    	}
    	// Если отсутствует, создадим файл с простой структурой для 1 строки
        else
    	{
    		using (XmlWriter writer = XmlWriter.Create("dataset.xml"))
    		{
                writer.WriteStartElement("Data");
                writer.WriteStartElement("rows");
                writer.WriteElementString("Type", "");
                writer.WriteElementString("Category", "");
                writer.WriteElementString("Date", "" + DateTime.Now.ToString("dd.mm.yyy") + "");
                writer.WriteElementString("Summ", "0");
                writer.WriteElementString("Total", "0");
                writer.WriteElementString("Comment", "");
                writer.WriteEndElement();
                writer.WriteEndElement();
                writer.Flush();
    		}
    	}
    	// Заполняем датагрид
    	DataGridFill(dataSet);
    	//Подписываемся на событие добавление новой строки
    	dataGridView1.RowsAdded += new DataGridViewRowsAddedEventHandler(RowsAdded);
    }


    В случае, если у нас отсутствовал файл, программа создаст файл с 1 строкой с такой структурой:
    <?xml version="1.0" standalone="yes"?>
    <Data>
      <rows>
        <Type />
        <Category />
        <Date>06.03.2020</Date>
        <Summ>0</Summ>
        <Total>0</Total>
        <Comment />
      </rows>
    </Data>


    Далее, метод добавления новой строки:
    Можем сделать не очень клёво и добавлять пустую строчку сразу в грид:
    private void Add_button_Click(object sender, EventArgs e)
    {
    	string empty = "";
    	string date = DateTime.Now.ToString("dd.mm.yyyy");
    
    	if (dataGridView1.Columns.Count != 0)
    	{
    		dataSet.Tables[0].Rows.Add(new object[] { empty, empty, date, empty, empty, empty });
    		dataGridView1.Update();
    	}
    	else
    		MessageBox.Show("Ошибка: Невозможно добавить строку в таблицу, в которой отсутствуют колонки",
    						"Ошибка",
    						MessageBoxButtons.OK,
    						MessageBoxIcon.Error);
    }


    А можем сделать удобнее, и вызвать окно, где введем/выберем нужные нам данные.

    Считать сумму можно как и при запуске, бегая циклом, так и при отрабатывании ивента dataGridView1.RowsAdded, на который мы подписались после заполнения грида:
    dataGridView1.RowsAdded += new DataGridViewRowsAddedEventHandler(RowsAdded);


    Например -- при запуске я немного форматирую грид и делаю такую штуку:

    private void DataGridFill(DataSet dataSet)
    {
    	if (dataSet != null)
    	{
            dataGridView1.DataSource = dataSet.Tables[0];
    		
    		for(int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
    		{
    			if (string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][4].ToString()))
                ataSet.Tables[0].Rows[i][4] = 0;
            }
    
    		for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
    		{
    			if (i != 0 && !string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][3].ToString()))
    				dataSet.Tables[0].Rows[i][4] = Convert.ToDouble(dataSet.Tables[0].Rows[i - 1][4]) + Convert.ToDouble(dataSet.Tables[0].Rows[i][3]);
          else if (!string.IsNullOrEmpty(dataSet.Tables[0].Rows[i][3].ToString()))
            dataSet.Tables[0].Rows[i][4] = dataSet.Tables[0].Rows[i][3];
    		}
        }
    
        dataGridView1.Columns[0].HeaderText = "Тип";
        dataGridView1.Columns[1].HeaderText = "Категория";
        dataGridView1.Columns[2].HeaderText = "Дата";
        dataGridView1.Columns[3].HeaderText = "Сумма";
        dataGridView1.Columns[4].HeaderText = "Итого";
        dataGridView1.Columns[5].HeaderText = "Комментарий";
    }


    Но это считает строго сумму, не учитывая тега расход/доход. Что бы учитывало, нужно проверять ячейку с типом и опираясь на это уже производить математические операции.
    Ответ написан
  • Как получить константы из другого класса для элементов в DataTemplate?

    yarosroman
    @yarosroman Куратор тега C#
    C# the best
    На сколько я помню wpf не умеет привязываться к полям, только к свойствам.
    Ответ написан
  • Как создать независимые вкладки в TabControl?

    Проблема с кешированием TabItem, скорее всего.
    Попробуйте воспользоваться
    <TabControl b:TabContent.IsCached=“True”>
    </TabControl>

    Отсюда: https://www.codeproject.com/Articles/460989/WPF-Ta...
    Ответ написан
  • Как исправить ошибку?

    Collin
    @Collin
    message, который заправляем в класс для расчёта CRC

    byte[] message = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x00 }; // Последние 2 байта под CRC, заполняем нолями 
    byte[] CRC = (new byte[2]);
    
    GetCRC data = new GetCRC();
    data._GetCRC(message, ref CRC); // для этого примера CRC будет равно 0xDDBA, т.е. BA DD
    
    byte[] message_out = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, CRC[0], CRC[1] };


    Рассчитать CRC

    class GetCRC
        {
            // -----------------------------------------------------------------------------
            //Возвращает двухбайтовую контрольную сумму. + Алгоритм расчета CRC
            // -----------------------------------------------------------------------------
            public void _GetCRC(byte[] message, ref byte[] CRC)              // входные данные функции : byte[] message(см. строчку где message.Length)- это данные которые пришли в функцию,
                                                                             // входные данные функции: ref byte[] CRC - эти данные мы получаем внутри этой функции и потом выводим в тело
                                                                             // программы откуда мы вызвали эту ффункцию
            {
                ushort CRCFull = 0xFFFF;                                     // 16-ти битовый регистр загружается числом FF hex (все 1), и используется далее как регистр CRC
                char CRCLSB;                                                 // переменная определения значения младшего бита в цикле
                for (int i = 0; i < (message.Length) - 2; i++)               //Повторяются шаги для следующего сообщения(1). Это повторяется до тех пор пока все байты сообщения не будут обработаны.  
                {
                    CRCFull = (ushort)(CRCFull ^ message[i]);                // Первый байт сообщения (- 2 это отсекаем место под CRC) складывается по ИСКЛЮЧАЮЩЕМУ ИЛИ
                                                                             // с содержимым регистра CRC. Результат помещается в регистр CRC
                    for (int j = 0; j < 8; j++)                              // цикл повторяется 8 раз
                    {
                        CRCLSB = (char)(CRCFull & 0x0001);                   // Если младший бит 0. Повторяется сдвиг (следующая строка).
                        CRCFull = (ushort)((CRCFull >> 1) & 0x7FFF);         // Регистр CRC сдвигается вправо(в направлении младшего бита) на 1 бит, старший бит заполняется 0
                        if (CRCLSB == 1)                                     // Если младший бит 1
                            CRCFull = (ushort)(CRCFull ^ 0xA001);            // Делается операция ИСКЛЮЧАЮЩЕЕ ИЛИ регистра CRC и полиномиального числа A001 hex
                    }
                }
                CRC[1] = (byte)((CRCFull >> 8) & 0xFF);                      // определяем получившийся старший байт 
                CRC[0] = (byte)(CRCFull & 0xFF);                             // определяем получившийся младший байт 
            }
    
        }


    По теме:
    Калькулятор CRC
    Как посчитать контрольную сумму CRC (32, 16, 8)
    Статья о расчете CRC на хабре
    Ответ написан
  • Почему не работает директива using static?

    @Ostic Автор вопроса
    Программист - любитель
    5e36cdb11d7d8491718993.jpeg
    всё работает - онлайн компилятор просто глючит видимо, а в студии всё отлично работает.
    И зачем такие советы давть типа иди, падаван, и читай 400-500 страниц, а потом...
    конкретный вопрос же был, связанный с директивой using static
    Ответ написан
  • ИИ, Нейронные сети, ML – для школьника?

    с чего начать?

    Создать, запустить, поиграть с простой нейронной сетью, чтобы попробовать, понять, ощутить, как оно всё.

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

    И выбрать и пройти какой-то вводный (видео-)курс по машинному обучению. Выбирайте:
    Ответ написан
  • Можно ли во ViewModel узнать ширину элемента View?

    FoggyFinder
    @FoggyFinder
    Зависит от того зачем вам нужна информация о размерах UI - элементов.

    Если это часть пользовательских настроек, то хранить их на уровне ViewModel совершенно нормально и никак не противоречит паттерну.

    Но если это нужно исключительно для временной настройки UI, то и код должен находится на уровне View.

    Для вашего примера решение будет таким: добавьте обработчик события клика на кнопку и выводить информацию там.

    MVVM это не означает что в code-behind не должно быть никакого кода. Это типичная ошибка. В .xaml.cs не должно быть того, что не относится непосредственно к отображению.

    Управление анимацией, вывод вспомогательных сообщений, кастомизация пользовательских элементов управления - все это может быть там.
    Ответ написан
  • Почему когда я из DataGridView добавляю значения в listbox появляется ошибка System.ArgumentNullException?

    @Av-IT
    Разработчик и админ SQL, консультант
    У вас ошибка происходит из-за того, что filmsDataGridView.Rows[i].Cells[7].Value в некоторых случаях у вас = null, а null вставлять в CombopBox нельзя

    5dfad14e21439463486042.jpeg

    Всегда конвертируйте null'ы к пустой строке так

    listBox1.Items.Add(Convert.ToString(filmsDataGridView.Rows[i].Cells[7].Value));

    или так:

    listBox1.Items.Add(filmsDataGridView.Rows[i].Cells[7].Value?.ToString() ?? String.Empty);
    Ответ написан
  • Клиент - серверное приложение на Xamarin?

    firedragon
    @firedragon
    Senior .NET developer
    Если нет требований по оффлайн работе можно использовать firebase

    https://docs.microsoft.com/ru-ru/xamarin/android/d...

    если же нужно чисто в пределах локальной сети то попробуйте вот это
    https://github.com/1iveowl/Simple-Http-Listener-PCL

    Код для переизбрания мастера в сети придется писать самому
    Ответ написан
  • Как сделать binding текста из textbox в label?

    @postya Автор вопроса
    Всё оказалось значительно проще)

    в xaml второго окна есть специальный метод при изменении текста:
    <TextBox x:Name="CategoryText"    
     TextChanged="ChangeText"
     Style="{StaticResource CategoryTextBox}" />


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

    public partial class FontWindow : Window
        {
             private MainWindow window;
    
            public FontWindow(MainWindow mainWindow)
            {
                InitializeComponent();
                window = mainWindow;
                
            }
    
           private void ChangeText(object sender, TextChangedEventArgs e)
            {
                TextBox tb = sender as TextBox;
                    window.CategoryLabel1.Content = tb.Text;
            }
    }
    Ответ написан
  • Как сделать binding текста из textbox в label?

    @valerahex
    При открытии второго окна, присвой DataContext`у объект из главного окна, и в главном при изменении значения вызывай событие INotifyPropertyChanged, для обновления визуального представления.
    Ответ написан
  • WPF ListBox как вручную отсортировать список перетаскиванием элементов мышкой?

    FoggyFinder
    @FoggyFinder
    Есть замечательная библиотека которая практически все делает за вас:

    GongSolutions.WPF.DragDrop

    Все, что вам нужно в простейших сценариях, это установить на разрешение перетаскивать ИЗ и В:

    dd:DragDrop.IsDragSource="True"
    dd:DragDrop.IsDropTarget="True"


    Обновляю ответ в связи с комментарием:

    Общая рекомендация:

    Если вы столкнулись с проблемой при использовании какой-то библиотеки, то задавайте конкретный вопрос с ней связанный, приводя минимально воспроизводимый пример. В противном случае начинается гадание на кофейной гуще.


    Привожу минимальный пример демонстрирующий что перетаскивание в пределах списка не является проблемой.

    VM:

    public class MainVM
    {
        private IEnumerable<FileInfo> GetFiles() =>
            Directory.EnumerateFiles(Directory.GetCurrentDirectory())
                        .Select(path => new FileInfo(path));
        public MainVM()
        {
            FileList = new ObservableCollection<FileInfo>(GetFiles());
        }
        public FileInfo CurrentFile { get; set; }
        public ObservableCollection<FileInfo> FileList { get; }
    }


    View:

    пространство имен:

    xmlns:dd="urn:gong-wpf-dragdrop"

    сам список:

    <ListBox
        dd:DragDrop.IsDragSource="True"
        dd:DragDrop.IsDropTarget="True"
        ItemsSource="{Binding FileList}"
        SelectedItem="{Binding CurrentFile}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock VerticalAlignment="Center" Text="{Binding Name}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>


    Гиф с результатом:

    5dee28369295b074649445.gif
    Ответ написан
  • Как построить график функции в windows forms c#?

    FoggyFinder
    @FoggyFinder
    Тут у вас сразу несколько ошибок:

    1. Нужно явно приводить к double иначе при делении двух int получите тоже целое.
    2. Вы берете очень большие границы. Рост знаменателя намного превышает скорость роста числителя. Сами посмотрите: возведите 50 в куб, что получите? График вы конечно построите, но наглядности будет немного.

    Что более важно: ваш отрезок OA = 2*a, а это значит что ваша правая граница точно должна быть меньше чем 2*a;

    3. Посмотрите как задана функция - в виде квадрата. Извлекая корень вы должны не забывать про нижнюю ветку - ту которую дают отрицательные значения y.
    Насколько мне известно возможности стандартного контрола довольно ограничены - вам придется заносить значения во вторую линию.

    Собирая все вместе, попробуйте что-то вроде такого:

    double a = 3;
    double step = 0.1;
    
    for (double x = 0; x < 2 * a - 1; x += step)
    {
        var n = x * x * x;
        var d = 2 * a - x;
        chart1.Series[0].Points.AddXY(x, Math.Sqrt(n / d));
        chart1.Series[1].Points.AddXY(x, -Math.Sqrt(n / d));
    }


    Здесь 1 (x < 2 * a - 1) вычитается только для примера, чтобы вы сравнили результат. В реальности вам придется определять границу более сложным путем чтобы для разных a и левой границы (x) получать наглядное представление. Но, по крайней мере, у вас есть от чего отталкиваться.
    Ответ написан
  • Как перенести метод для кнопок в отдельный класс в WPF?

    @Jewish_Cat
    Увлекаюсь C#
    Изучай паттер MVVM и его используй.

    Пример:
    Код взял из боевого решения. Если будет непонятно, спрашивайте
    public partial class SetColdBalance : Window
        {
    
            public SetColdBalance()
            {
                InitializeComponent();
            }
        }

    public class RelayCommand<T> : ICommand
        {
            #region Fields
    
            readonly Action<T> _execute = null;
            readonly Predicate<T> _canExecute = null;
    
            #endregion
    
            #region Constructors
    
            /// <summary>
            /// Initializes a new instance of <see cref="DelegateCommand{T}"/>.
            /// </summary>
            /// <param name="execute">Delegate to execute when Execute is called on the command.  This can be null to just hook up a CanExecute delegate.</param>
            /// <remarks><seealso cref="CanExecute"/> will always return true.</remarks>
            public RelayCommand(Action<T> execute)
                : this(execute, null)
            {
            }
    
            /// <summary>
            /// Creates a new command.
            /// </summary>
            /// <param name="execute">The execution logic.</param>
            /// <param name="canExecute">The execution status logic.</param>
            public RelayCommand(Action<T> execute, Predicate<T> canExecute)
            {
                if (execute == null)
                    throw new ArgumentNullException("execute");
    
                _execute = execute;
                _canExecute = canExecute;
            }
    
            #endregion
    
            #region ICommand Members
    
            ///<summary>
            ///Defines the method that determines whether the command can execute in its current state.
            ///</summary>
            ///<param name="parameter">Data used by the command.  If the command does not require data to be passed, this object can be set to null.</param>
            ///<returns>
            ///true if this command can be executed; otherwise, false.
            ///</returns>
            public bool CanExecute(object parameter)
            {
                return _canExecute == null ? true : _canExecute((T)parameter);
            }
    
            ///<summary>
            ///Occurs when changes occur that affect whether or not the command should execute.
            ///</summary>
            public event EventHandler CanExecuteChanged
            {
                add { CommandManager.RequerySuggested += value; }
                remove { CommandManager.RequerySuggested -= value; }
            }
    
            ///<summary>
            ///Defines the method to be called when the command is invoked.
            ///</summary>
            ///<param name="parameter">Data used by the command. If the command does not require data to be passed, this object can be set to <see langword="null" />.</param>
            public void Execute(object parameter)
            {
                _execute((T)parameter);
            }
    
            #endregion
        }

    <Window x:Class="AdminTool.SetColdBalance"
            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:i="http://schemas.microsoft.com/expression/2010/interactivity"
            xmlns:local="clr-namespace:AdminTool"
            mc:Ignorable="d"
            Title="Задать баланс"
            Height="150"
            Width="250"
            ResizeMode="NoResize"
            WindowStartupLocation="CenterScreen"">
        <Window.DataContext>
            <local:ColdWalletViewModel/>
        </Window.DataContext>
        <Grid>
         <Button Grid.Row="2" Width="100" Height="30" Content="Save" Command="{Binding SaveColdWallets}"/>
        </Grid>
    </Window>

    public class ColdWalletViewModel : BindableBase
        {
            ICommand _saveColdWallet;
            public ICommand SaveColdWallets
            {
                get
                {
                    return _saveColdWallet ?? (_saveColdWallet = new RelayCommand<object[]>((obj) =>
                    {
                       ///Тут пишешь что должна выполнять твоя кнопка
                    }), /*Тут можно написать условие при котором можно будет выполнить данную команду*/);
                }
            }
        }

    /// <summary>
        ///     Implementation of <see cref="INotifyPropertyChanged" /> to simplify models.
        /// </summary>
        public abstract class BindableBase : INotifyPropertyChanged
        {
            /// <summary>
            ///     Multicast event for property change notifications.
            /// </summary>
            public event PropertyChangedEventHandler PropertyChanged;
    
            /// <summary>
            ///     Checks if a property already matches a desired value.  Sets the property and
            ///     notifies listeners only when necessary.
            /// </summary>
            /// <typeparam name="T">Type of the property.</typeparam>
            /// <param name="storage">Reference to a property with both getter and setter.</param>
            /// <param name="value">Desired value for the property.</param>
            /// <param name="propertyName">
            ///     Name of the property used to notify listeners.  This
            ///     value is optional and can be provided automatically when invoked from compilers that
            ///     support CallerMemberName.
            /// </param>
            /// <returns>
            ///     True if the value was changed, false if the existing value matched the
            ///     desired value.
            /// </returns>
            protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
            {
                if (Equals(storage, value))
                {
                    return false;
                }
    
                storage = value;
                this.OnPropertyChanged(propertyName);
                return true;
            }
    
            /// <summary>
            ///     Notifies listeners that a property value has changed.
            /// </summary>
            /// <param name="propertyName">
            ///     Name of the property used to notify listeners.  This
            ///     value is optional and can be provided automatically when invoked from compilers
            ///     that support <see cref="CallerMemberNameAttribute" />.
            /// </param>
            protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    Ответ написан