Ответы пользователя по тегу C#
  • Как использовать Command в привязке WPF?

    Nipheris
    @Nipheris Куратор тега C#
    Ну, если прям на чистом WPF, без всякого упрощающего жизнь обвеса типа ReactiveUI, то как-то так.

    Код вьюмодельки.
    internal class MainViewModel
    {
    	private sealed class PlayCmd(MainViewModel mainViewModel) : ICommand
    	{
    		/// <summary>
    		/// Можно ли вызвать команду? Влияет на доступность привязанных к команде контролов, например кнопки
    		/// </summary>
    		public bool CanExecute(object? parameter) =>
    			// команду Play можно вызвать только если мы ещё не начали проигрывание
    			!mainViewModel.isPlaying;
    
    		/// <summary>
    		/// Ивент, нужный чтобы уведомить об изменении значения свойства CanExecute
    		/// </summary>
    		public event EventHandler? CanExecuteChanged;
    
    		public void Execute(object? parameter)
    		{
    			// вызываем метод у вьюмодели
    			mainViewModel.Play();
    			// дёргаем событие, чтобы сообщить всем, кто привязался к команде,
    			// что её статус "можно исполнить" изменился
    			// если этого не сделать, то кнопка НЕ задизаблится (хотя CanExecute уже возвращает false)
    			this.OnCanExecuteChanged();
    		}
    
    		private void OnCanExecuteChanged() =>
    			this.CanExecuteChanged?.Invoke(this, EventArgs.Empty);
    	}
    
    	private readonly PlayCmd playCommand;
    	private bool isPlaying = false;
    
    	public MainViewModel()
    	{
    		this.playCommand = new(this);
    	}
    
    	public ICommand PlayCommand => this.playCommand;
    
    	public void Play()
    	{
    		//Player.Play();
    		this.isPlaying = true;
    	}
    }

    Код вьюхи.
    <Window x:Class="Miramax.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:Miramax"
    		mc:Ignorable="d"
    		Title="MainWindow" Height="450" Width="800">
    	<Window.DataContext>
    		<local:MainViewModel />
    	</Window.DataContext>
    	<Grid>
    		<Button Command="{Binding PlayCommand}">Click</Button>
    	</Grid>
    </Window>
    Ответ написан
    1 комментарий
  • Как узнать параметры с которыми скомпилирована или собрана dll на C#?

    Nipheris
    @Nipheris Куратор тега C#
    Очень похожий стек в этой issue (которая была создана по мотивам этой), предлагаю отслеживать её.
    Ответ написан
  • Как написать на с++ метод и экспортировать его в c# заинлайнить, и можно ли _fastcall его сделать???

    Nipheris
    @Nipheris Куратор тега C++
    Экспортированная функция работает в 4 раза медленнее.

    Разумеется, у вас всё время уходит на накладные расходы на PInvoke. Это полное безумие - выносить сложение чисел вообще в функцию, а тем более ещё и делать вызовом между языками. А PInvoke - это вам не InternalCall

    ВОПРОС как сделать функцию sum в с++ что бы она работала так же быстро как и sum в c# коде? Как ее заинлайнить

    Методы Math реализованы в самом рантайме и вызываются без маршалинга с помощью InternalCall. Не думаю, что это возможно для вашей функции.

    К примеру, если хочу c# библиотеку сделать, то просто добавили ссылку и забыл о всем. А когда добавляю так же ссылку на dll от с++ проекта, то ноль реакции.

    Потому что dll которые получились из C# - это дотнетовские сборки, которые только прикидываются Portable Executable, а вот то, что компилится из C++ - это действительно Portable Executable, и ничего дотнетовского там нет (если конечно это обычный C++ DLL-проект, а не C++/CLI).

    Кстати еще вопрос, как библиотеку с++ подключать к проекту, почему DllImport не находит, если указать ссылку на проект,

    Вам нужно настроить копирование C++ DLL в выходную директорию проекта, рядом с вашей дотнет-сборкой, в которой находится DllImport
    Ответ написан
    Комментировать
  • В чём отличие многопоточности и асинхронности в контексте .NET C#?

    Nipheris
    @Nipheris Куратор тега C#
    Асинхронность - это способ организации вычислений, когда код, вызывающий какую-либо операцию/подпрограмму /функцию, не дожидается завершения работы этой операции, а если ему интересен результат вычислений, то он получает вместо готового результата некий способ запросить результат позже, когда он будет готов (то, что называется промисом или фьючером или ещё как-то в зависимости от языка). Это по сути противоположность "обычному" синхронному вызову, когда вызывающий код останавливается и ждёт завершения функции, чтобы получить результат. Как это будет достигнуто - это уже другой вопрос, это зависит от сути операции, запускаемой асинхронно.

    Но ведь при классической многопоточности никакой поток так же не блокируется

    Что такое "классическая многопоточность"? Что это за термин? Что такое неклассическая многопоточность?
    Если брать потоки ОС, то операционка просто передаёт управление созданному потоку в желаемую точку входа и дальше уже поток решает что и как делать. Поток может молотить вычисления 10 минут, потом записать их куда-нибудь в файл и завершиться. Никаких кормлений задачами не будет (хотя я не совсем понимаю что такое кормить задачами в вашем контексте).

    Тем более при асинхронности практически всегда подразумевается многопоточность

    С чего бы? Асинхронный код полезен при большом количестве операций ввода-вывода - диск, сеть и т.д. Не обязательно это должно быть что-то, вычисляющееся в отдельном потоке. Вот, почитайте хорошую статью: There is no thread.

    Вам будет полезно ознакомиться с асинхронностью в какой-нибудь изначально однопоточной среде, например JS в браузере не считая вебворкеров. Тогда вы поймёте разницу.
    Ответ написан
    5 комментариев
  • Кто подскажет, как у созданного программно TextBox вытащить значения C# WPF?

    Nipheris
    @Nipheris Куратор тега C#
    textblock1.Text сгодится?
    Ответ написан
    Комментировать
  • Ошибка "Can't write CLR type System.String with handler type Int32Handler", что делать?

    Nipheris
    @Nipheris Куратор тега C#
    drschool_Data.command.Parameters.Add(new NpgsqlParameter("value4", NpgsqlDbType.Integer)); // тут Integer
    ...
    string selectedPlace = place.SelectedItem.ToString();
    drschool_Data.command.Parameters[3].Value = selectedPlace; // тут String
    ...
    Ответ написан
    1 комментарий
  • Почему компилятор не может прочитать значения из appsettings?

    Nipheris
    @Nipheris Куратор тега C#
    Видимо нужно вот так:
    var asd = config.VendorConfigs.Where(x => x.IntegrationServiceId == vendorId).First();
    Ответ написан
    Комментировать
  • Как ответить на POST запрос?

    Nipheris
    @Nipheris Куратор тега C#
    вероятнее всего я даже не путаю, а просто неверно понимаю принцип работы. Я полагаю, что PostAsync действует как для запроса, так и для ответа, верно? Если нет, то что служит для отправки ответа, а самое главное, как в этот ответ положить свою информацию?

    У объектов класса HttpListenerContext есть не только свойство Request, и но Response. Оно возвращает объект HttpListenerResponse, у которого, в свою очередь, есть свойство OutputStream и много чего ещё интересного (ContentType, Headers и так далее). Вот с этим и работайте.
    Ответ написан
    Комментировать
  • Зачем мне универсальный класс, если в методе я могу указать родительский класс?

    Nipheris
    @Nipheris Куратор тега C#
    Если под "универсальным классом" вы имеете в виду класс-дженерик, то почитайте про параметрический полиморфизм и полиморфизм через подтипы. Параметрический полиморфизм в контексте C# это про дженерики, полиморфизм через подтипы - это о вашем "указать родительский класс".

    Это сильно разные механизмы, и чтобы понять разницу, попробуйте реализовать какой-нибудь List или Dictionary без использования дженериков, как предлагает вам Василий Банников , и как было в .NET 1.1 (о боги, это было как будто позавчера), до появления обобщённых типов. И увидите, как теряется типобезопасность и сколько нужно кастить туда-сюда.
    Ответ написан
    Комментировать
  • Как корректно воспользоваться регулярным выражением?

    Nipheris
    @Nipheris Куратор тега C#
    using System;
    using System.Text.RegularExpressions;
    					
    public class Program
    {
    	public static void Main()
    	{
    		string data = "some text *text* ok *text* hello **world*";
    		// Надо, чтобы стало "some text **text** ok **text** hello ***world**"
    		string pattern = @"(?:[*])([^*].*?)(?:[*])";
    		var regex = new Regex(pattern);
    		var result = regex.Replace(data, m => $"*{m.Value}*");
    		Console.WriteLine(result);
    	}
    }

    А у вас что-то странное в коде делается с поиском совпадений и заменами. Вообще не понял, что вы хотели сделать, это так не работает.
    Ответ написан
    Комментировать
  • Как измерить температуру процессора в си шарп?

    Nipheris
    @Nipheris Куратор тега C#
    Если других способов нет, то что еще можно использовать для Сида, что бы рандом был правда хорошим, а не таким какой он есть по умолчанию.

    Сделайте так же, как в VeraCrypt - предоставьте пользователю возможность пошевелить мышкой случайным образом.
    Ответ написан
    Комментировать
  • Правильно ли объединять WPF и WinForms проекты в одно решение (solution)?

    Nipheris
    @Nipheris Куратор тега C#
    В дотнете внешние и межпроектные зависимости (PackageReference, ProjectReference) прописываются и ставятся для каждого проекта отдельно. Более того, по умолчанию каждый library-проект также становится самостоятельным NuGet-пакетом, если в настройках включить сборку последнего.

    Солюшен - это лишь примочка для объединения нескольких проектов во что-то, что можно собрать одной командой в IDE или в консоли. Ну и открывать сразу всё в IDE тоже удобно.

    Лично я рекомендую в большинстве случаев пользоваться подходом "один Git-репозиторий - один солюшен - много проектов". Репозиторий - единица версионирования (т.е. ВСЕ проекты в репе всегда имеют одинаковую версию), проект/пакет - единица управления зависимостями.

    Итого имеем следующие выводы:
    • вы собираетесь притащить к себе довольно толстые библиотеки, "подружить" которые в рамках одного исполняемого бинарника будет непросто. Т.к. для шарповых MSBuild-проектов каждый проект (csproj) собирается в отдельную сборку (assembly), то логично иметь WPF и WinForms варианты в виде отдельных проектов (и в виде двух разных бинарей на выходе)
    • если вы планируете общий релиз для обоих приложений - т.е. когда не бывает так, что допустим WPF-приложение релизится, а WinForms - нет - тогда делайте один репозиторий и один солюшен с несколькими проектами;
    • если вы планируете независимый релиз для каждого приложения - тогда другая история, но надеюсь вам это не нужно
    Ответ написан
    2 комментария
  • Как задавать длину линии в сантиметрах и рисовать такую линию (C# в WPF на Canvas)?

    Nipheris
    @Nipheris Куратор тега C#
    В ваших расчётах вы не учли реальную плотность пикселей вашего монитора (physical PPI). Тот DPI, который вы вычислили, описывает некий эталонный монитор с 96 PPI, а реальный монитор может значительно отличаться. Иными словами, вы скорее получили информацию об установленном у вас масштабе экрана, и пока не соотнесли это с реальным физическим устройством, которое установлено конкретно у вас.

    Если вы сейчас подключите себе проектор, то очевидно, что длина линии будет зависеть от расстояния от проектора до доски - тут уже проще померять длину некоторой эталонной линии (допустим, 500 пикселей), и по ней определить, сколько пикселей картинки приходится на сантиметр какой-либо поверхности (экран монитора, доска проектора). Соотв-но эту длину должен померять пользователь и ввести в вашу программу. С монитором чуть проще - возможно есть способ запросить у некоторых устройств отображения физический размер или физический PPI.
    Ответ написан
  • .baml файл? как редактировать и сохранить в проект?

    Nipheris
    @Nipheris Куратор тега C#
    XAML и так компЕлируется в BAML, когда вы собираете ваш проект, и встраивается в ресурсы результирующей сборки.

    Поэтому неясно, почему вы это спрашиваете и почему это вас беспокоит. Какой у вас тип проекта и какую UI-библиотеку вы используете?
    Ответ написан
    9 комментариев
  • В чем разница между get/set и обычной переменной?

    Nipheris
    @Nipheris Куратор тега C#
    Главная архитектурная причина одна - выставить стабильный интерфейс в виде свойства, оставляя за собой возможность поменять его реализацию. Это позволит в будущем сделать какие-то из свойств вычислимыми, или, как уже отметил Hemul GM , добавить проверки каких-нибудь условий/инвариантов. При этом не потребуется пересобирать клиентский код.

    Правда осознанно это делают только авторы библиотек/nuget-пакетов (публичных или приватных, в рамках компании), остальные скорее потому, что так сказали.
    Ответ написан
    Комментировать
  • В каких случаях использовать Ковариантность и Контрвариантность?

    Nipheris
    @Nipheris Куратор тега C#
    https://en.wikipedia.org/wiki/Covariance_and_contr...
    For example, in C#, if Cat is a subtype of Animal, then:
    • IEnumerable<Cat> is a subtype of IEnumerable<Animal>. The subtyping is preserved because IEnumerable<T> is covariant on T.
    • Action<Animal> is a subtype of Action<Cat>. The subtyping is reversed because Action<T> is contravariant on T.

    Даже не знаю, что добавить.
    Ответ написан
    Комментировать
  • Как можно создавать приложения в стиле Windows 10/11?

    Nipheris
    @Nipheris Куратор тега C#
    Самая свежая группа технологий для этого - Windows App SDK, и конкретно WinUI как его часть. См. видео с презентацией.

    Приложение-галерея контролов.
    Ответ написан
    3 комментария
  • Как правильно перенести папку проекта?

    Nipheris
    @Nipheris Куратор тега C#
    Удалите из солюшена текущий проект, перенесите все его файлы в подпапку, добавьте проект в солюшен уже из подпапки. Затем добавьте новый проект.
    Ответ написан
    Комментировать
  • Почему при использовании конструкции TryEnter() не запускается второй поток?

    Nipheris
    @Nipheris Куратор тега C#
    Ну видимо потому что второму потоку не удалось захватить блокировку, он пошёл в ветку else и, после вывода сообщения, завершил свою работу, т.к. в теле функции Run больше нет инструкций.

    Странно, что вы это спрашиваете, если писали этот код.
    Ответ написан
    Комментировать