• На чем писать кроссплатформенные приложения?

    zo0m
    @zo0m
    full stack developer
    Я не могу рекомендовать, но я бы поглядел на Angular2, а именно вместе с :
    - NativeScript для мобилок (https://www.nativescript.org/showcases)
    - Electron для десктопа (electron.atom.io/apps/)
    Я этими штуками пока, что не пользовался. А от Angular2 в восторге, очень логичный и правильный фреймворк выходит, как по мне. Пишу уже почти пол года на нем.
    Ответ написан
    5 комментариев
  • На чем писать кроссплатформенные приложения?

    NeiroNx
    @NeiroNx
    Программист
    Kivy - вполне кросплатформенный как и питон
    но питон требует среду для свой работы, но можно собрать в готовые приложения со всеми зависимостями под любую ОС весить будет 20+ Мб так как тащит дофига библиотек за собой.
    Ответ написан
    3 комментария
  • Как запустить Steam под Ubuntu?

    zolt85
    @zolt85
    Программист
    Траблы с рантаймом у них
    rm ~/.steam/bin32/steam-runtime/i386/usr/lib/i386-linux-gnu/libstdc++.so.6
    rm ~/.steam/bin32/steam-runtime/i386/lib/i386-linux-gnu/libgcc_s.so.1
    rm ~/.steam/bin32/steam-runtime/amd64/lib/x86_64-linux-gnu/libgcc_s.so.1
    rm ~/.steam/bin32/steam-runtime/amd64/usr/lib/x86_64-linux-gnu/libstdc++.so.6
    rm ~/.steam/bin32/steam-runtime/i386/usr/lib/i386-linux-gnu/libxcb.so.1
    Ответ написан
    Комментировать
  • Черный экран с мигающим курсором при загрузке Ubuntu. Что делать?

    @cssman
    У вас после загрузки ubuntu курсор на чёрном экране? или до него? мб просто до grub не доходит? или загрузчик не передаёт управление ОС?
    Ответ написан
  • Как сделать перегрузку функций?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Прямой перегрузки - нет.
    Однако, можно проэмулировать через функцию с произвольным количеством переменных:
    stackoverflow.com/questions/4697705/php-function-o...
    и подмену стандартных функций на свои:
    php.net/manual/ru/function.override-function.php
    Ответ написан
    Комментировать
  • Как сделать перегрузку функций?

    DevMan
    @DevMan
    Кстати в PHP 7 это не введут?
    PHP7 уже ввели, и перегрузки там нет.

    Это очень печально.
    ну имеем, что имеем.
    в принципе, без перегрузок спокойно можно жить.

    как же работают стандартные функции типа rand
    так
    Ответ написан
    Комментировать
  • Аутентификация на Yii?

    slo_nik
    @slo_nik Куратор тега Yii
    Доброе утро.
    В этой статье всё расписано.

    А в этой целая лекция на четыре часа по авторизации, аутентификации и rbac.
    Ответ написан
    Комментировать
  • Почему не получается сделать анимацию цвета?

    @kestik
    Вы пытаетесь анимировать свойство Fill при помощи ColorAnimation, но это свойство, в случае заливки круга сплошным цветом, содержит в себе SolidColorBrush. В свою очередь, SolidColorBrush содержит свойство Color, которое вы можете анимировать, используя ColorAnimation.
    Вот Ваш исправленный пример:
    <Ellipse Width="50" Height="50" Fill="#fff">
        <Ellipse.Triggers>
            <EventTrigger RoutedEvent="Ellipse.Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <ColorAnimation Storyboard.TargetProperty="(Ellipse.Fill).(SolidColorBrush.Color)" To="Yellow" Duration="0:0:3" RepeatBehavior="Forever" AutoReverse="True"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Ellipse.Triggers>
    </Ellipse>


    Пример с мигающим кругом:
    <Ellipse Width="50" Height="50" Fill="White">
      <Ellipse.Triggers>
        <EventTrigger RoutedEvent="Ellipse.Loaded">
          <BeginStoryboard>
            <Storyboard>
              <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Ellipse.Fill).(SolidColorBrush.Color)" RepeatBehavior="Forever" FillBehavior="Stop">
                <DiscreteColorKeyFrame Value="Red" KeyTime="0:0:3"/>
                <DiscreteColorKeyFrame Value="White" KeyTime="0:0:3.1"/>
              </ColorAnimationUsingKeyFrames>
            </Storyboard>
          </BeginStoryboard>
        </EventTrigger>
      </Ellipse.Triggers>
    </Ellipse>


    Пояснения по второму примеру:
    ColorAnimationUsingKeyFrames — анимация цвета при помощи ключевых кадров на временной шкале.
    Свойство FillBehavior="Stop" возвращает объект в исходное состояние после окончания анимации.

    DiscreteColorKeyFrame — ключевой кадр анимации цвета без плавных переходов между кадрами.
    Свойство Value задает необходимое значение для анимируемого свойства (в данном случае это свойство — Fill).
    Свойство KeyTime задает положение ключевого кадра на временной шкале.

    Свойство KeyTime второго ключевого кадра анимации задает продолжительность видимости красного цвета. В данном примере продолжительность равна 100мс, потому как второй ключевой кадр активируется через 100мс после первого.
    Ответ написан
    2 комментария
  • Можно ли указать в одном биндинге несколько конвертеров?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Вам не нужно делать второй конвертер, а настроить тот, чтобы возвращал нужное значение - возвращать Visibility.Collapsed при истине и Visibility.Visible при лжи.
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if ((bool)value)
        {
            return parameter != null ? Visibility.Collapsed : Visibility.Hidden;
        }
        return Visibility.Visible;
    }


    А если нужно именно проверять несколько различных проверок у одного элемента, то используйте MultiBinding. Я написал об этом тут.
    Ответ написан
    9 комментариев
  • Почему TextBox не растягивается?

    <DockPanel LastChildFill="True" Height="25">
    
                <Button DockPanel.Dock="Right" Content="Send" MaxWidth="50"/>
                <TextBox HorizontalAlignment="Stretch" Margin="0,0,5,0" Background="Blue"/>
            </DockPanel>
    Ответ написан
    Комментировать
  • Аналоги PasswordBox?

    @Hydro
    C#/.NET Developer
    Абсолютно нормально работает стандартный контрол.
    Биндить его можно через хелпер, тут описано как
    Ответ написан
    Комментировать
  • Двойной клик по итему ListBox-а?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Нужно просто поставить привязку с командой у вашей вьюмодели. Вы ведь используете MVVM?

    Гораздо удобнее использовать не создавать вручную ICommand, а сделать класс, реализующий этот интерфейс. Обычно его называют DelegateCommand (классы указаны ниже).

    И дальше во вьюмодели создаёте свойство для команды и привязывайте то место, где нужна команда, к созданной команде во вьюмодели.

    #region Свойства
    
    public ObservableCollection<MyClass> Collection { get; set; } = new ObservableCollection<MyClass>
    {
        new MyClass { Name = "Иванов Иван" },
        new MyClass { Name = "Петров Пётр" },
        new MyClass { Name = "Сидоров Сидор" },
    };
    public MyClass SelectedCollection { get; set; };
    
    #endregion
    
    #region Команды
    
    private ActionCommand _myCommand;
    public ActionCommand MyCommand => _myCommand ?? (_myCommand = new ActionCommand(MyMethod));
    
    private DelegateCommand<MyClass> _myDelegateCommand;
    public DelegateCommand<MyClass> MyDelegateCommand => _myDelegateCommand ?? (_myDelegateCommand = new DelegateCommand<MyClass>(MyMethod2, item => item != null);
    
    private void MyMethod()
    {
        // обработка команды
    }
    
    private void MyMethod2(MyClass item)
    {
        // обработка команды
    }
    
    #endregion


    <ListBox ItemsSource="{Binding Collection}" SelectedItem="{Binding SelectedItem}"/>
    <Button Command="{Binding MyCommand}" Content="Команда 1"/>
    <Button Command="{Binding MyDelegateCommand}" CommandParameter="{Binding SelectedItem}" Content="Команда 2"/>


    Если нужна команда не на событие Сlick, а на любое другое событие (как вы говорите, на DoubleClick), то нужно сделать добавить референс на System.Windows.Interactivity и указать триггер на событие:
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

    <ListBox ItemsSource="{Binding Collection}" SelectedItem="{Binding SelectedItemc}" DisplayMemberPath="Name">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDoubleClick">
                <i:InvokeCommandAction Command="{Binding MyDelegateCommand}" CommandParameter="{Binding SelectedItem}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </ListBox>


    Класс DelegateCommand - команда с параметром, и класс ActionCommand - команда без параметра. Нешаблонный класс DelegateCommand используется реже (я вообще не припомню, чтобы его использовал).
    public class DelegateCommand<T> : ICommand
    {
        #region Private fields
    
        private readonly Action<T> _execute;
        private readonly Func<T, bool> _canExecute;
    
        #endregion
    
        #region Constructors
    
        public DelegateCommand(Action<T> execute, Func<T, bool> canExecute = null)
        {
            _execute = execute;
            _canExecute = canExecute;
        }
    
        #endregion
    
        #region DelegateCommand
    
        public void Execute(T parameter)
        {
            var handler = _execute;
            if (handler != null)
            {
                handler(parameter);
            }
        }
    
        public bool CanExecute(T parameter)
        {
            var handler = _canExecute;
            return handler == null || handler(parameter);
        }
    
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
    
        #endregion
    
        #region ICommand
    
        void ICommand.Execute(object parameter)
        {
            Execute((T)parameter);
        }
    
        bool ICommand.CanExecute(object parameter)
        {
            return CanExecute((T)parameter);
        }
    
        #endregion
    }
    
    public class DelegateCommand : DelegateCommand<object>
    {
        public DelegateCommand(Action<object> execute, Func<object, bool> canExecute = null)
            : base(execute, canExecute)
        {
        }
    }
    
    public class ActionCommand : DelegateCommand<object>, ICommand
    {
        #region Private fields
    
        private readonly Action _action;
        private readonly Func<bool> _canExecute;
    
        #endregion
    
        #region Constructors
    
        public ActionCommand(Action action, Func<bool> canExecute = null)
            : base(null, null)
        {
            _action = action;
            _canExecute = canExecute;
        }
    
        #endregion
    
        #region ActionCommand
    
        public void Execute()
        {
            var handler = _action;
            if (handler != null)
            {
                handler();
            }
        }
    
        public bool CanExecute()
        {
            var handler = _canExecute;
            return handler == null || handler();
        }
    
        #endregion
    
        #region ICommand
    
        void ICommand.Execute(object parameter)
        {
            Execute();
        }
    
        bool ICommand.CanExecute(object parameter)
        {
            return CanExecute();
        }
    
        #endregion
    }
    Ответ написан
    1 комментарий
  • Как сделать асинхронность без await?

    Trixon
    @Trixon
    Суровый ASP.NET веб-разработчик
    Вы вызываете await на методе, помеченном async, назовём его MethodAsync.
    В методе MethodAsync, в точке, где вызывается другой асинхронный метод вместе с await, компилятор разбивает метод MethodAsync на две части. До await и после await.
    Всё, что было до await, выполняется в контексте первичного потока.
    Операция, помеченная await (в методе MethodAsync) + всё, что было после неё, выполняется в контексте вторичного потока.

    Вызывая await Task.Delay, Вы всё равно заимствуете вторичный поток из пула. Можно сказать, это то же самое, что вызвать await Task.Run, поместив туда часть метода, которая находилась бы после await Task.Delay.

    Вот код, пробуйте:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static async Task MethodDelayAsync()
            {
                Console.WriteLine("1. MethodDelayAsync: before await thread id: {0}", Thread.CurrentThread.ManagedThreadId);
    
                await Task.Delay(1000);
    
                Console.WriteLine("2. MethodDelayAsync: after await thread id: {0}", Thread.CurrentThread.ManagedThreadId);
            }
            
            static async Task MethodTaskRunAsync()
            {
                Console.WriteLine("1. MethodTaskRunAsync: before await thread id: {0}", Thread.CurrentThread.ManagedThreadId);
    
                await Task.Run(() =>
                {
                    Console.WriteLine("Asynchronous operation in MethodTaskRunAsync in thread id: {0}",
                        Thread.CurrentThread.ManagedThreadId);
                });
    
                Console.WriteLine("2. MethodTaskRunAsync: after await thread id: {0}", Thread.CurrentThread.ManagedThreadId);
            }
    
            static void Main(string[] args)
            {
                Console.WriteLine("Start Main in thread id: {0}", Thread.CurrentThread.ManagedThreadId);
    
                //MethodDelayAsync();
                MethodTaskRunAsync();
    
                Console.WriteLine("End Main in thread id: {0}", Thread.CurrentThread.ManagedThreadId);
                
                Console.Read();
            }
        }
    }


    Раскомментировав MethodTaskRunAsync:
    Start Main in thread id: 1
    1. MethodTaskRunAsync: before await thread id: 1
    Asynchronous operation in MethodTaskRunAsync in thread id: 3 -- вторичный поток из пула.
    End Main in thread id: 1
    2. MethodTaskRunAsync: after await thread id: 3 -- вторичный поток из пула.

    Раскомментировав MethodDelayAsync:
    Start Main in thread id: 1
    1. MethodDelayAsync: before await thread id: 1
    End Main in thread id: 1
    2. MethodDelayAsync: after await thread id: 4 -- вторичный поток из пула.

    А это значит, что всё происходит ровно так, как сказано мною выше.
    Ответ написан
    7 комментариев
  • Как разделить XAML код?

    @MonkAlex
    C#, SQL, Delphi, C++ etc
    DataContext и так спускается сверху, вам для этого ничего дополнительно делать не надо.
    Ответ написан
    Комментировать
  • Почему функция объявленная на сервере как асинхронная генерируется на клиенте как синхронная?

    @mayorovp
    По поводу "что за фингя" - это нормально. Дело в том, что за передаваемые по сети данные отвечает только тип double, а Task - это лишь способ вызова (синхронный или асинхронный).

    Можно поискать в настройках Service Reference ключик, который отвечает за генерацию интерфейсов обратного вызова. Я точно не помню, можно ли этим управлять.

    Другой вариант, на случай если не найдете - просто исправьте double на Task<double> вручную.
    Ответ написан
    3 комментария