Задать вопрос
Ответы пользователя по тегу WPF
  • Как ожидать нажатия клавиши без заморозки основного потока?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Во-первых - для работы с хоткеями используйте соответствующие события, а не проверку нажата ли или нет клавиша. ОС предоставляет для этого специальные API и оно уже реализовано на уровне приложения. Проверка в цикле "нажата ли клавиша" просто тупо будет грузить процессор на 100% и 99.999% времени эта проверка бесполезна, при этом ОС уведомит приложении о клавише отдельным сообщением. Если надо глобальные хоткеи на уровне приложения - это делается через добавление кода в проверку системных сообщений окну и создание события, на которое уже вешается свой обработчик и какие-то там действия в приложении. Если надо хоткей на уровне системы - то тут надо использовать хук.
    Второе - это ошибка, поиск в гугле которой, стразу же приведет вас к решению и объяснению, почему так. Кроме того, она же на русском даже.
    Ответ написан
  • Как сделать так, чтобы антивирусы не блокировали файл WPF?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Подписать доверенным сертификатом.

    UPD:
    Еще можно попробовать пропустить результат через обфускатор или упаковать тем же Enigma Virtual Box.
    Ответ написан
  • Как лучше организовать библиотеку кастомных контролов в WPF?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Группирую элементы управления в дерево по типам и, если надо по подтипам - кнопки, иконки, инпуты и т.д. и т.п. Аналогично и ресурсы для элементов - точно такое же дерево, чтобы не запутаться. Потому что даже в одном простом приложении может быть десяток видов одного и того же элемента управления. А логика работы может быть очень запутанной.
    Ответ написан
    Комментировать
  • Как изменить цвет ComboBox wpf c#?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Серьезно что-ли? Документацию открыть религия не позволяет? https://docs.microsoft.com/en-us/dotnet/api/system... -> Ctrl+F -> Color
    Ответ написан
    Комментировать
  • Сколько времени займёт создание базы данных на C# и WPF без SQL?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Несколько минут. Например:
    public class MyDB
    {
        public List<Message> Messages = new List<Message>();
        public List<User> Users = new List<User>();
    }
    
    public class Message
    {
        public DateTime Time = new DateTime();
        public string Text;
        public ulong UserID;
        public Message(ulong userId, string text)
        {
            Text = text;
            UserID = userId;
        }
    }
    
    public class User
    {
        private static ulong Cnt = 0;
        public ulong Id;
        public string Name;
        public User(string name)
        {
            Name = name;
            Id = ++Cnt;
        }
    }
    Ответ написан
    Комментировать
  • C# WPF почему при Window.Left = 0 между границей экрана и окном появляется пустое пространство?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Это не отступы, это граница окна. Наличие границы и её толщина задается в свойствах окна или в стилях, точно не помню, т.к. в разных версиях ОС она может быть разной.
    Ответ написан
    Комментировать
  • Как по нажатию кнопки отобразить на форме вордовский документ?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
  • Как правильно написать простенький тест на 3 варианта ответа?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Правильно организовать на самом деле очень просто и достаточно использовать стандартные организационные методы:
    1. Подготовить ТЗ
    2. Собрать требования, ограничения
    3. Подготовить ЧТЗ
    4. Сделать декомпозицию задачи на подзадачи/подсистемы/подмодули
    5. Разработать архитектуру
    6. Проработать подзадачи/подсистемы/подмодули
    7. Разработать тесты, при необходимости
    8. Поэтапно произвести процесс разработки
    Ответ написан
    Комментировать
  • Как исправить размытый текст в Windows Forms?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Гуглите DpiAware — изучите проблемы и выберете оптимальное решение для себя. Тут проблема в диком легаси наследии, реализованном через костыли и которое пытаются сохранить, добавляя исправления в виде костылей, которые генерируют новые баги и в новых версиях это пытаются исправить опять костылями. Кроме того, алгоритм работы масштабирования немного отличается в разных версиях ОС. Так что очень рекомендую проверять работу приложения в разных версиях ОС (7, 8.1, 10 Home, 10 Enterprise LTS) и с выключенным и включенным масштабированием. Да-да, в домашней десятке и в корпоративной долгосрочной десятке можно получить разный результат.

    Вариант 1 — вызов специальной функции в коде (реальный код, который я использую — плюс вторая функция для масштабирования шрифтов, тык — примерно так получается в 4к):
    const int WinDefaultDPI = 96;
    
    /// <summary>
    /// Исправление блюра при включенном масштабировании в ОС windows 8 и выше
    /// </summary>
    public static void DpiFix()
    {
        if (Environment.OSVersion.Version.Major >= 6)
        {
            SetProcessDPIAware();
        }
    }
    
    /// <summary>
    /// WinAPI SetProcessDPIAware 
    /// </summary>
    /// <returns></returns>
    [DllImport("user32.dll")]
    private static extern bool SetProcessDPIAware();
    
    /// <summary>
    /// Исправление размера шрифтов
    /// </summary>
    /// <param name="c"></param>
    public static float DpiFixFonts(Control c)
    {
        Graphics g = c.CreateGraphics();
        float dx = g.DpiX
            , dy = g.DpiY
            , fontsScale = Math.Max(dx, dy) / WinDefaultDPI
        ;
        g.Dispose();
        return fontsScale;
    }


    Плюс все формы имеют следующий конфиг (код, вызываемый в конструкторах форм):
    this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;


    Учтите, что AutoScaleDimensions — в конструкторе выставляется автоматически в зависимости от разрешения и DPI вашего монитора. Поэтому я не использую конструкторы. Иначе, при запуске приложения на разных машинах с разным DPI можно получить очень неожиданные результаты.

    Вариант 2 (v4.7):
    app.config
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
      </startup>
      <System.Windows.Forms.ApplicationConfigurationSection>
        <add key="DpiAwareness" value="PerMonitorV2" />
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
      </System.Windows.Forms.ApplicationConfigurationSection>
    </configuration>


    Вариант 3 (v4.7):
    app.config
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <configSections>
      </configSections>
      <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7" />
      </startup>
      <System.Windows.Forms.ApplicationConfigurationSection>
        <add key="DpiAwareness" value="PerMonitorV2" />
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="false" />
      </System.Windows.Forms.ApplicationConfigurationSection>
    <configuration>


    Вариант 4:
    app.manifest
    <!-- Указывает, что приложение поддерживает определение DPI и не будет автоматически масштабироваться Windows при более высоких
           значениях DPI. Приложения Windows Presentation Foundation (WPF) по умолчанию поддерживают определение DPI, им не нужно 
           специально включать параметр для этого. Для приложений Windows Forms на платформе .NET Framework 4.6, для которых задан этот параметр, необходимо 
           также задать для "EnableWindowsFormsHighDpiAutoResizing" значение "true" в файле app.config.-->
      <application xmlns="urn:schemas-microsoft-com:asm.v3">
        <windowsSettings>
          <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
        </windowsSettings>
      </application>
    Ответ написан
    6 комментариев
  • Возможно ли изменить цвет нарисованной с помощью DrawingVisual фигуры?

    VoidVolker
    @VoidVolker Куратор тега C#
    Dark side eye. А у нас печеньки! А у вас?
    Вы бы почитали как вообще в ПК работают изображения и каким образом оно показывается на экране. Если говорить простыми словами: есть контекст рисования (изображение/виртуальный экран), который состоит из двухмерного массива пикселей. Когда какая-то функция рисует какую-то фигуру в этом экране — то она просто меняет цвет пикселей там. Если надо нарисовать фигуру другого цвета — то просто берем и вызываем эту функцию с теми же параметрами, но другим цветом.
    Ответ написан
  • На чём лучше писать десктопные приложения?

    VoidVolker
    @VoidVolker Куратор тега JavaScript
    Dark side eye. А у нас печеньки! А у вас?
    На нативных ЯП — C# вполне адекватный инструмент. Десктопные приложения с HTML/JS очень толстые и медленные. Если уж и делать - то лучшим выбором будет NWJS (отличная документация, постоянно выходят новые версия с багфиксами и обновлениями, новые фичи, разработчики открыты к диалогу с юзерами, ничего лишнего нету, большое коммьюнити). Электрон не советую - т.к. он менее стабильный (есть печальный опыт попытки использования в продакшене) и плюс есть баги, которые не будут исправляться.
    Ответ написан
    2 комментария