Ответы пользователя по тегу WPF
  • C#. Как реализовать межпроцессорное взаимодействие?

    teoadal
    @teoadal
    .NET + AS3
    Я использую вот такой украденный где-то код. Он контролирует, что приложение создано, работает, а если запускается ещё одно такое же - сообщает об этом.
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Channels;
    using System.Runtime.Remoting.Channels.Tcp;
    using System.Threading;
    
    namespace Pressmark.Service
    {
        [Serializable]
        class SingletonController : MarshalByRefObject
        {
            private const string ControllerName = "PressMarkInstance";
            private static TcpChannel _mTcpChannel = null;
            private static Mutex _mMutex = null;
    
            public delegate void ReceiveDelegate(string[] args);
    
            static private ReceiveDelegate _mReceive = null;
            static public ReceiveDelegate Receiver
            {
                get { return _mReceive; }
                set { _mReceive = value; }
            }
    
    
            public static bool IamFirst(ReceiveDelegate r)
            {
                if (IamFirst())
                {
                    Receiver += r;
                    return true;
                }
                else
                {
                    return false;
                }
            }
    
            public static bool IamFirst()
            {
                _mMutex = new Mutex(false, "PressMarkInstance");
    
                if (_mMutex.WaitOne(1, true))
                {
                    //We locked it! We are the first instance!!!    
                    CreateInstanceChannel();
                    return true;
                }
    
                //Not the first instance!!!
                _mMutex.Close();
                _mMutex = null;
                return false;
            }
    
            private static void CreateInstanceChannel()
            {
                _mTcpChannel = new TcpChannel(1234);
                ChannelServices.RegisterChannel(_mTcpChannel, false);
                RemotingConfiguration.RegisterWellKnownServiceType(typeof(SingletonController), ControllerName,
                    WellKnownObjectMode.SingleCall);
            }
    
            public static void Cleanup()
            {
                if (_mMutex != null)
                {
                    _mMutex.Close();
                }
    
                if (_mTcpChannel != null)
                {
                    _mTcpChannel.StopListening(null);
                }
    
                _mMutex = null;
                _mTcpChannel = null;
            }
    
            public static void Send(string[] s)
            {
                TcpChannel channel = new TcpChannel();
                ChannelServices.RegisterChannel(channel, false);
                SingletonController ctrl = (SingletonController)Activator.GetObject(typeof(SingletonController), "tcp://localhost:1234/" + ControllerName);
                ctrl.Receive(s);
            }
    
            public void Receive(string[] s)
            {
                if (_mReceive != null) _mReceive(s);
            }
        }
    }


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

    private void App_OnStartup(object sender, StartupEventArgs e)
            {
                if (!SingletonController.IamFirst(RunCommand))
                {
                    var args = e.Args;
                    if (args.Length == 0) args = new[] { "newwindow" };            // если мы просто пытаемся открыть новый документ, а сервис уже запущен
                    SingletonController.Send(args);
                    Current.Shutdown();
                    return;
                }
    
                RunCommand(e.Args);
                if (OpenedDocuments.Count == 0) CreateNewWindow(null);          // если ещё ни одного окна не создано, создаем его пустое.
            }


    Не очень прозрачно (давно хотел переделать, но руки не доходили), но разобраться можно. Соответственно, RunCommand и CreateNewWindow методы вам нужно реализовать самому.
    Ответ написан
  • Как нарисовать такую форму в WPF?

    teoadal
    @teoadal
    .NET + AS3
    Если только на пальцах... На русском книгу не подскажу.

    Вам надо смотреть в сторону точек привязки. В WPF всё привязывается друг к другу, к краям и к направляющим линиям (такие "синие полоски" которые можно установить посередине окна). Причем привязываться можно разными краями.

    Например, дропбокс с надписью "Все" у вас привязан к правому ли левому краю. И поэтому при увеличении размера окна он растягивается. Надо отвязать его от левого края и тогда он не изменит размера, а просто отодвинется к правому. У вас ведь нижняя часть окна адекватно расходится вправо. Смотрите как там и делайте тоже самое с дропбоксом.

    Теперь по поводу самой таблицы. Я давно работал с WPF, так что могу ошибаться. Но где-то там тоже есть привязки самих столбцов к направляющим и краям. Возможно, в коде. Возможно, это можно сделать как-то визуально.
    Ответ написан
  • Task или Thread в C#.NET 4.0 WPF?

    teoadal
    @teoadal
    .NET + AS3
    ЕМНП, главные отличия: Task берется из пула потоков (следовательно накладных расходов по созданию практически нет), а Thread - поток создается сам (с накладными расходами, но большей свободой, например - дать имя). Пул ограничен в количестве (новые будут ставиться в очередь), Thread можете создавать как хочется и когда хочется, но при превышении критической массы, они будут вызывать скорее торможение, чем ускорение.

    В .NET 4.5 появились async/await - это синтаксический сахар, который делает код более красивым и понятным. .NET 4 для тех же целей можно пользоваться вот этим: blogs.msdn.com/b/bclteam/archive/2012/10/22/using-...
    Ответ написан
    Комментировать