Как использовать WPF UserControls или Windows изнутри Visual FoxPro 9

У меня очень, очень большое и сложное приложение Visual FoxPro 9. Я хотел бы переписать части этого приложения в WPF с конечной целью - завершить вырезание через пару лет. Я потратил много времени на поиск в Google и stackoverflow, чтобы найти полный пример типа «привет, мир», как реализовать это с помощью COM-взаимодействия. Обнаружены кусочки и фрагменты, но ничего полного, что показывает как сторону FoxPro, так и сторону WPF.

Моя интуиция подсказывает мне, что у меня могут возникнуть проблемы с ресурсами XAML, сторонними элементами управления или другими обычными функциями приложения WPF, если я попытаюсь запустить его через COM-взаимодействие.

Итак, два вопроса. Может ли кто-нибудь указать мне на небольшой сквозной образец, который либо запускает окна WPF из FoxPro, либо позволяет мне размещать пользовательские элементы управления WPF в форме FoxPro? Или я прав в своих опасениях по поводу потенциальных проблем с взаимодействием и должен вообще этого избегать? Если да, то есть ли рекомендуемый способ взаимодействия этих двух исполняемых файлов друг с другом?


person RobDog    schedule 27.03.2018    source источник
comment
через пару лет Windows 7 будет устаревшей, а вместе с ней и WPF. Вам стоит взглянуть на кое-что новее, возможно, на Electron или UWP, если у вас нет проблем с Windows.   -  person Liero    schedule 27.03.2018
comment
Есть ли недавний ресурс от Microsoft, который заявляет об этом, или это только ваше мнение?   -  person RobDog    schedule 27.03.2018
comment
Это очень большая и сложная проблема. Я сделал именно то, о чем вы просите. Вот какой-то ресурс: west-wind.com/presentations/VfpDotNetInterop/DotNetFromVFP.asp < / а>; codemag.com/Article/0703112; west-wind.com/presentations/dotnetfromVfp/; stackoverflow.com/questions/2186829/. Я также могу сказать вам, что у меня были проблемы с использованием приложения класса WPF. Если у вас хватит терпения, я могу написать вам свое исследование.   -  person Babbillumpa    schedule 28.03.2018
comment
У меня нет комментариев о будущем WPF. Но в любом случае, это специфическая вещь для MS. После VFP вы все еще рискнули бы снова довериться MS? Это одно, а другое - я бы держался подальше от COM (еще одна вещь, специфичная для платформы). Я нахожусь в том же положении, что и вы, и сделал кое-что из того, что вы описываете в прошлом, и никогда больше не пойду по этому пути (а именно COM и Silverlight - SL еще один образец, демонстрирующий надежность MS). Возможно, вам стоит рассчитывать на использование служб REST, micro, gRPC ... для данных и интерфейсов на основе HTML для пользовательского интерфейса (Qt - еще один хороший вариант кроссплатформенного пользовательского интерфейса)   -  person Cetin Basoz    schedule 29.03.2018
comment
Я должен придерживаться технологии, которая может быть максимально тесно интегрирована с приложением foxpro. Затраты на разработку потребуют около 500 тысяч долларов, чтобы полностью переписать его, а владение им просто не позволит. На данный момент мой лучший вариант - делать это понемногу, и на этом остается WPF. Нашел несколько примеров кода для запуска процессов и контроля, работают ли они еще. Итак, я, вероятно, просто воспользуюсь какой-то реализацией двойного процесса и позволю приложениям foxpro и wpf обмениваться данными.   -  person RobDog    schedule 29.03.2018
comment
@RobDog, почему вы думаете, что WPF будет устаревшим? он хорошо работает на W10.   -  person Zam    schedule 23.05.2018


Ответы (1)


Я понятия не имею, можно ли запускать wpf внутри Visual FoxPro. Я предполагаю, что вам придется написать его как activex. Недавно я поработал над расширением приложения MS Access. Мое приложение wpf полностью отделено и работает вместе с приложением доступа ms. Я общался между ними с помощью очереди сообщений MS, которая является компонентом com. Может быть, такой подход сработает для вас.

Когда я хотел показать экран в wpf из доступа, я добавил кусок xml в локальную очередь сообщений. Приложение wpf прослушивает эти сообщения, передает их объектам, которые сообщают ему, какой экран показывать, и предоставляют ему какие-либо параметры. MS Access подписывается на событие полученного сообщения в очереди сообщений, и таким образом он может определить, когда окно wpf закрывается и пользователь завершает работу. Это было предназначено для использования шаблона душителя для постепенной замены функциональности в старом приложении доступа.

Вот код для очереди, которая управляет всем. Различные классы pop десериализованы из сообщения, и я создаю его как строку в доступе.

internal class QueueListener
{
    public const string qFromMadge = @".\private$\XXXXQ";
    public static string qToMadge = @".\private$\XXXXReturnQ";
    private MessageQueue mq;
    internal QueueListener()
    {
        try
        {
            SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
            SubscribeHandler();

            var mqSend = setUpQueue(qToMadge);
            mqSend.Close();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.InnerException.Message);
        }
    }
    private MessageQueue setUpQueue(string qName)
    {
        MessageQueue q;
        if (MessageQueue.Exists(qName))
        {
            q = new MessageQueue(qName);
        }
        else
        {
            q = MessageQueue.Create(qName);
        }
        q.ResetPermissions();
        q.SetPermissions("Everyone", MessageQueueAccessRights.FullControl, AccessControlEntryType.Set);
        q.Purge();
        return q;
    }
    private void ReceiveMsgCompleted(Object source, ReceiveCompletedEventArgs asyncResult)
    {
        MessageQueue mq = (MessageQueue)source;
        Message m = mq.EndReceive(asyncResult.AsyncResult);
        m.Formatter = new XmlMessageFormatter(new[] { "XXXX.Popaaaa, XXXX"
                                                    , "XXXX.Popbbbb, XXXXX"
                                                    , "XXXX.Popcccc, XXXX"
                                                    , "XXXX.Popdddd, XXXX"
        });

        ((BasePopView) m.Body).Pop();

        mq.BeginReceive();
    }

    public  void UnsubscribeHandler()
    {
        if (mq == null)
        {
            return;
        }
        mq.Close();
        mq.ReceiveCompleted -= new ReceiveCompletedEventHandler(ReceiveMsgCompleted);
        mq = null;
    }
    public  void SubscribeHandler()
    {
        if(mq != null)
        {
            return;
        }
        mq = setUpQueue(qFromMadge);
        mq.ReceiveCompleted += ReceiveMsgCompleted;
        mq.BeginReceive();
    } 
person Andy    schedule 27.03.2018
comment
Интересная тема об использовании XAML в VFP. sweetpotatosoftware.com/blog/index .php / 2007/06/11 / - да, это было сделано путем размещения элемента управления WPF внутри элемента управления Windows Form и после этого всего в компонент ActiveX - person Zam; 23.05.2018