• Как в WPF фильтровать двойной клик по ListView только левой кнопкой?

    FoggyFinder
    @FoggyFinder
    Можно пойти разными способами:

    1. Использовать InputBinding, а именно MouseBinding. Тут LeftDoubleClick один из вариантов отслеживаемых действий, посмотреть весь список можно тут

    2. Использовать CallMethodAction вместо InvokeCommandAction, тогда вы сможете учитывать аргументы события.
    Сигнатура метода должна быть точно такая же как если бы вы обрабатывали событие в View части.

    3. Поискать реализацию (или написать самостоятельно) EventToCommand где будет метод PassEventArgsToCommand (с корректной реализацией)
    Ответ написан
    2 комментария
  • Если объект соприкасается с чёрным цветом, то выполнять вывод в консоль?

    FoggyFinder
    @FoggyFinder
    Вначале небольшое лирическое отступление.

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

    Теперь к вопросу.

    Ваш объект (obj) это PictureBox , элемент управления, у которого, что не удивительно, нет своего метода intersects.

    Но вы можете использовать свойство Bounds чтобы получить местоположение и размеры ваших объектов:

    if(pictureBox1.Bounds.IntersectsWith(pictureBox2.Bounds))
    {
    // put your code here
    }


    По поводу второй части - проверки что объект определенного цвета. Чтобы быть уверенным что картинка полностью одного цвета придется проверять каждый пиксель.
    Но, я думаю, что вы можете добиться цели намного более простым способом.

    Например, если ваш объект может менять цвета, а вас интересует является ли он черным, то в момент смены цветы храните это состояние (isBlack) в свойстве Tag вашего pictureBox.

    Если вы пишите какую-то простую игру по типу змейки, то пока не завязли, советую уделить немного времени на разделение кода на смысловые части - определите классы описывающую ваши объекты, логику взаимодействия и отдельно их отображение на форме.
    Ответ написан
    5 комментариев
  • Не запускается таймер c# (xamarin), что не так?

    FoggyFinder
    @FoggyFinder
    В Xamarin.Forms можно использовать Device.StartTimer
    Ответ написан
    Комментировать
  • Где найти наставника по программированию или сообщества для совместной разработки?

    FoggyFinder
    @FoggyFinder
    В вопросе слишком мало деталей - не понятен ваш опыт. Вы только-только начинаете входить в профессию или вы уже знакомы с основами.

    По вопросу могу предположить второе, но если я ошибаюсь - уточните в комментариях и я обновлю ответ.

    Ведущие разработчики OpenSource проектов практически всегда рады новым участникам. Даже если вы просто исправите опечатку в документации. Страх начать довольно часто встречается, поэтому в некоторых OpenSource проектах вы увидите специальные сообщения:

    Imposter syndrome disclaimer: I want your help. No really, I do.

    There might be a little voice inside that tells you you're not ready; that you need to do one more tutorial, or learn another framework, or write a few more blog posts before you can help me with this project.


    Посоветовать какой-то конкретный проект не могу - вы не указали ни языки программирования ни направление которые вас интересуют. Но GitHub отличное место для поисков.

    Теперь что касается наставников - сейчас хватает сайтов с подобными предложениями, дам ссылку на пару из них:

    Обучение программированию с ментором по индивидуал...

    Codementor - Find a mentor to help you in real time

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

    Сообществ программистов где люди делятся опытом сейчас достаточно:

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

    • Если вас беспокоит нечто неопределенное или вы просто собираете информацию от более опытных коллег, то лучше подойдут различного рода чаты.


    Возвращаясь к вопросу наставничества. Что касается бесплатных вариантов, то FSSF (F# Software Foundation) два раза в год бесплатно проводит F# Mentorship program. Для того чтобы принять участие вам нужно присоединиться к FSSF, подробнее читайте тут и затем подать заявку здесь.
    Регистрация на осеннюю сессию открылась сегодня и продлится до 31 августа. По понятным причинам учеников регистрируются намного больше чем желающих быть наставниками, поэтому не расстраивайтесь если вас не отобрали.

    F# удивительный язык и если вы еще с ним не знакомы советую обратить на него самое пристальное внимание. Даже если в дальнейшем вам не придется с ним работать, то знания функционального подхода точно не будет лишним.
    Ответ написан
    6 комментариев
  • Как поместить XAML элементы в C# массив, чрез цикл?

    FoggyFinder
    @FoggyFinder
    Сложность в реализации связана с выбранным вами подходом. Нужно работать с данными, а не с элементами управления.

    В вашем случае вы ожидаете от пользователя ввод какого-то текста.
    Каждому текстовому полю с правой стороны отвечает одно свойство. Для примера рассмотрим случаи наличия только одного поля для ввода. Назовем его Greeting.

    Для начала определим XAML разметку:

    <TextBox Text="{Binding Greeting, UpdateSourceTrigger=PropertyChanged}"
             TextWrapping="Wrap" />


    UpdateSourceTrigger=PropertyChanged означает что вы хотите изменять свойство Greeting всякий раз когда пользователь меняет что-то в текстовом поле.

    Теперь нужно определить класс который будет отвечать за хранения и обработку данных, назовем его SimpleVM:

    public class SimpleVM : INotifyPropertyChanged
    {
        private string greeting;
    
        public string Greeting
        {
            get { return greeting; }
            set
            {
                greeting = value;
                OnPropertyChanged(nameof(Greeting));
            }
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
        public void OnPropertyChanged([CallerMemberName]string prop = "")
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
        }
    }


    Интерфейс INotifyPropertyChanged необходим для того чтобы оповещать всех интересующихся об изменениях значений в свойстве объекта. В роли интересующегося здесь у нас выступает интерфейс. Всякий раз когда вы будете изменять свойство Greeting графический интерфейс будет обновлять свое представление.

    Осталось отобразить вводимое слово в виде квадратиков. Для этого прекрасно подойдет ItemsControl:

    <ItemsControl Grid.Column="0" ItemsSource="{Binding Greeting}" >
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <TextBox IsReadOnly="True" Text="{Binding .}" 
                         Width="20" Foreground="Black" 
                         BorderThickness="1" BorderBrush="Black" Height="23" 
                         Background="{x:Null}" Margin="1, 3" />
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>


    И не забываем установить DataContext, для начала можно в конструкторе главного окна:

    public MainWindow()
    {
        InitializeComponent();
        DataContext = new SimpleVM();
    }


    Когда вы станет познакомитесь с MVVM немного больше вы сможете устанавливать контекст снаружи окна (как это обычно и делается).

    А пока результат получается следующим:

    5d36e9309ffef101248000.gif
    Ответ написан
    5 комментариев
  • Как сделать roadmap для полного обучения C# и wpf?

    FoggyFinder
    @FoggyFinder
    Есть два вариант:

    1. От теории к практике
    2. (Боевой режим) Сразу практика на пет проекте.

    Первый хорошо, на мой взгляд, естественно, подходит тем у кого небольшой опыт или нет никакого предыдущего опыта в десктоп разработке.

    Если выберите первый подход, то вам подойдет любая книга по WPF. Несмотря на то, что доступная литература относительно старая, а WPF скоро перейдет на .NET Core 3.0 информация в большинстве своем актуальна. Лично я начинал с книги Мэтью Макдональда - WPF: Windows Presentation Foundation в .NET 4.5 с примерами на C# 5.0 для профессионалов и должен сказать что доволен и подачей материала и степенью подробности изложения.

    Есть и онлайн ресурсы, самые известные:

    Руководство по WPF
    WPF - Windows Presentation Foundation

    Если английский язык у вас хотя-бы на уровне PreIntermediate то крайне рекомендую обратить внимание на

    2,000 Things You Should Know About WPF

    Тут рассматриваются как основы так и продвинутые редкие случаи и советы которые очень часто встречаются в real world проектах. Можете идти от одного номера к другому вот и получится своеобразный список проблем.

    И, конечно, документация

    Windows Presentation Foundation

    Если вы знаком с MVVM по другим фреймверкам (XF, Avalonia, ...) то я бы посоветовал сразу начать с практики углубляя знания по мере необходимости.

    Самый главный шаг вы уже сделали - найти ресурс (а лучше сразу несколько), где можно задавать вопросы, а также помогать другим людям с решением уже их проблем. Сами не заметите как ваш уровень прилично подрастет.

    Ну а пока желаю удачи и, надеюсь, увидимся в других темах ;)
    Ответ написан
    6 комментариев
  • Как получить значение с foreach и передать его методу?

    FoggyFinder
    @FoggyFinder
    public List<string> GetPhotoUrl() => 
                Api.Wall
                   .Get(new WallGetParams { Domain = "lol.community", Count = 2 })
                   .WallPosts
                   .Select(item => (item.Attachments[0].Instance as Photo).Sizes[0].Url.AbsoluteUri.ToString())
                   .ToList();
    Ответ написан
    Комментировать
  • В какие языки транслируется F#?

    FoggyFinder
    @FoggyFinder
    Как уже написали выше, вопрос только в затратах на написание. Поэтому прежде всего хотелось бы узнать причины возникновения такого вопроса.

    Если вас интересует список OS проектов, то кроме вышеупомянутого Fable (который очень популярен), есть еще FEZ

    FEZ - an F# to core erlang experiment

    Но учтите, что проект экспериментальный.

    Fjord это еще один экспериментальный проект, который давно не обновлялся:

    Fjord, F# programming language for the JVM.

    Также отмечу активно разрабатываемый CoreRT:

    > The CoreRT compiler can compile a managed .NET Core application into a native (architecture specific) single-file executable that is easy to deploy.

    Что касается поддержки F#, то советую обратить внимание на этот ишшуй:

    F# Status on CoreRT and UWP #6055
    Ответ написан
    Комментировать
  • Как отследить нажатую клавишу в mvvm?

    FoggyFinder
    @FoggyFinder
    Используйте KeyBinding:

    <TextBox.InputBindings>
        <KeyBinding Key="Enter" Command="{Binding SearchCommand}" />
    </TextBox.InputBindings>
    Ответ написан
    Комментировать
  • Как сделать ластик для InkCanvas?

    FoggyFinder
    @FoggyFinder
    Ластик - стандартный функционал для InkCanvas.

    Измените свойство EditingMode на подходящий для вас формат - установите его равным EraseByPoint или EraseByStroke
    Ответ написан
    Комментировать
  • Как проверить были ли все кликнуты элементы?

    FoggyFinder
    @FoggyFinder
    Рассматривайте "было ли нажатие" как состояние.

    Создайте новый, отдельный класс, который будет содержат все дополнительные состояния, свойства объекта для более удобной с ним работы:

    public class SomeObject
    {
        public bool WasClicked { get; set; }
        public MapObject2 Object { get; }
    
        public SomeObject(MapObject2 mobj)
        {
            Object = new MapObject2(mobj);
        }
    }


    Внимание - не используйте название SomeObject. Наименования должны отражать смысл, назначение объекта. Мне сложно понять цель проекта поэтому дать осмысленное название не могу. К классу MapObject2 это тоже относится.

    Есть и другие варианты, но я бы на вашем месте остановился именно на таком подходе.
    Ответ написан
  • Определить кол-во вхождений строки в строку - почему не работает?

    FoggyFinder
    @FoggyFinder
    Отбрасывая синтаксический ошибки (отсутствие точки с запятой и инициализации переменной) получаем следующую проблему:

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

    Метод IndexOf вернет -1, в том случае если поиск оказался безрезультатным.

    Очевидная проверка решает проблему:

    if (index == -1)
        break;


    Теперь к вопросу о том можно ли немного сократить код сохранив при этом подход.

    Для начала использование метода Contains здесь выглядит избыточным - метод IndexOf вполне неплохо справится с этой задачей поиска.

    Отдельная переменная length только создает лишний шум - длина подстроки остается неизменной.

    Кроме того вместо метода Remove можно использовать метод Substring. Здесь большой разницы в использовании между ними нет, то лично мне кажется что название Substring лучше отражает суть происходящего. Но тут уже дело вкуса.

    Напоследок - в C# принято называть методы с заглавной буквы, лучше соблюдать принятые соглашение об именовании.

    Итого:

    static int StringCounter(string s1, string s2)
    {
        int count = 0;
        int index;
        while (true)
        {
            index = s1.IndexOf(s2);
            if (index == -1)
                return count;
            s1 = s1.Substring(index + s2.Length);
            count++;
        }
    }
    Ответ написан
    33 комментария
  • Можно ли комментировать локальные переменные Visual Studio [нельзя]?

    FoggyFinder
    @FoggyFinder
    Если вы имеете ввиду xml-документацию, то нельзя.

    Локальные переменные - детали реализации. Старайтесь давать самодокументируемые названия, а сложные участки кода дополнительно сопровождайте комментариями.
    Ответ написан
    3 комментария
  • Как решить проблему?

    FoggyFinder
    @FoggyFinder
    В таких случаях первое что нужно сделать это проверить наличие подписки на событие.

    В IDE Visual Studio убедиться можно в конструкторе (ПКМ по элементу -> "Свойства", затем вкладка "События") и ищете в списке требуемое. Там же можно и подписаться.

    Или добавить подписку самостоятельно в конструкторе:

    button1.Click += button1_Click;
    button2.Click += button2_Click;
    Ответ написан
    1 комментарий
  • Из за чего ен отображаются изображения в ListBox?

    FoggyFinder
    @FoggyFinder
    В шаблоне элемента списка вы устанавливаете источником привязки ImageList - коллекцию BitmapImage

    <Image Width="100" Height="75" IsEnabled="False"
           Source="{Binding Path= ImageList}"  />


    У изображения нет такого свойства, и следовательно ничего не отображается. Здесь вы хотите использовать сам объект, а не какое-либо из его свойств. Просто не указывайте Path в привязке (или сообщите в явном виде используя символ .: {Binding Path = . })

    <Image Width="100" Height="75" IsEnabled="False"
           Source="{Binding}"  />


    Совет

    Image может сам подцепить картинку если использовать корректный путь к файлу, а значит можно упростить класс убрав ImageList и использовав в привязке LinksToPictures. Кроме этого можно безболезненно убрать приватные свойства (вы все равно не сможете к ним привязаться). В итоге после небольшого рефакторинга получится следующий класс:

    public class Gallery
    {
        private string directoryPath; // Путь к каталогу
        public IEnumerable<string> LinksToPictures { get; } // Названия файлов
    
        public Gallery(string directoryPath)
        {
            this. directoryPath = directoryPath;
            LinksToPictures = Directory.GetFiles(directoryPath, "*.jp*g");
        }
    }


    Примечание:

    1. Устанавливать ItemsSource для списка можно в разметке:

    ItemsSource="{Binding LinksToPictures}"

    Если вы так пробовали делать, но не видели изменений, проверьте что DataContext был установлен, на данном этапе это можно сделать так:

    public MainWindow()
    {
        InitializeComponent();
        DataContext = new Gallery("F://");
    }


    В дальнейшем вы научитесь устанавливать контекст извне окон.

    2. Если вы хотите изменять значение свойства из кода объекта (Galery) вам нужно будет реализовать интерфейс INotifyPropertyChanged (или, сокращенно INPC).

    А для того, чтобы интерфейс обновлялся при изменении последовательности элементов (удаление, добавление и т.д.), коллекция должна реализовывать интерфейс INotifyCollectionChanged (в ответах и комментариях вы можете увидеть часто используемое сокращение - INCC).
    List<_> к таким коллекциям не относится, поэтому лучше заменить на ObservableCollection.

    Это очень важные интерфейсы, поэтому рекомендую разобраться как они работают.
    Ответ написан
    2 комментария
  • C# По нажатию на кнопку запускается start.bat, путь где находится start.bat считывается из Settings.xml, Как это реализовать?

    FoggyFinder
    @FoggyFinder
    Для чтения информации из XML вы можете использовать Linq2Xml, XmlSerializer, XmlDocument или что-то другое.

    В вашем случае, на мой взгляд, лучше подойдет Linq2Xml так как исходный файл маленький и информацию из него нужно извлекать всякий раз по запросу.

    На русском языке есть онлайн туториал:

    Выборка элементов в LINQ to XML
    Общие сведения о LINQ to XML (C#)

    Приведенный в вопросе xml не валиден - он содержит более одного корневого элемента (Settings), добавьте к нему root:

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
       <Settings>
          <PathToFile>"C:\Users\1234\Desktop\start.bat"</PathToFile>
       </Settings>
       <Settings>
          <PathToFile>"C:\Users\1234\Desktop\start2.bat"</PathToFile>
       </Settings>
    </root>


    Не могу сказать что мне нравится такая структура xml, но, по крайней мере, теперь с ним можно работать.

    Для чтения пути:

    var path = "Settings.xml"; // путь к файлу настроек
    var batName = "start.bat";
    
    var xdoc = XDocument.Load(path); 
    var batPath =
        xdoc
        .Descendants("PathToFile") // ищем элементы PathToFile
        .SingleOrDefault(xe => xe.Value.Contains(batName)); // ищем единственный из них содержащий нужный bat файл
    
    if (batPath == null) // если в файле нет нужного пути
    {
        MessageBox.Show("Путь не указан"); // сообщаем пользователю
    }
    else // иначе
    {
        Process.Start(batPath.Value.Trim('"')); // запускаем процесс
    }
    Ответ написан
  • Как обработать событие в рамках MVVM через Interactions.Triggers у подключенной библиотеки?

    FoggyFinder
    @FoggyFinder
    Написать свой триггер для учета прикрепляемых событий. Как, например, сделано тут:

    https://sergecalderara.wordpress.com/2012/08/23/ho...

    или тут
    Ответ написан
    3 комментария
  • Как правильно указать DataContext в UserControl MVVM?

    FoggyFinder
    @FoggyFinder
    Проблема не с назначением DataContext для UserControl. Для связывания команды с кнопкой используется свойство Command а не Click:

    <Button Command="{Binding OpenDataBaseEditorView}">Open</Button>
    Ответ написан
  • Как изменить цвет WPF-элементов (цвет взять из файла)?

    FoggyFinder
    @FoggyFinder
    Используйте динамические ресурсы. Пример:

    1. Добавляйте в ресурсы приложения (файл App.xaml):

    <Application.Resources>
        <SolidColorBrush x:Key="solidGrayBrush" Color="Gray" />


    Будьте внимательны и не путайте ресурсы объектов WPF и ресурсы сборки.

    2. Ссылаетесь в элементе как динамический ресурс:

    <TextBlock
        Background="{DynamicResource solidGrayBrush}"
        Text="Test" />


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

    Brush[] brushes =
            typeof(Brushes)
            .GetProperties()
            .Select(p => (Brush)p.GetValue(null))
            .ToArray();
    Random r = new Random();


    и обработчик нажатия на кнопку:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var b = brushes[r.Next(brushes.Length)];
        Application.Current.Resources["solidGrayBrush"] = b;
    }


    5cab235c13a81873403570.gif
    Ответ написан
  • Как установить скаченную тему на WPF DataGrid?

    FoggyFinder
    @FoggyFinder
    Добавить в файлов ресурсов:

    <Application.Resources>
        <!--<ResourceDictionary Source="/DataGridThemes;component/ExpressionLight.xaml" />-->
        <!--<ResourceDictionary Source="/DataGridThemes;component/ExpressionDark.xaml" />-->
        <ResourceDictionary Source="/DataGridThemes;component/WhistlerBlue.xaml" />
    </Application.Resources>
    Ответ написан
    Комментировать