Nano Hash - криптовалюты, майнинг, программирование

Тема вызывает главное окно?

Итак, в основном у меня есть MainWindow, класс SetupViewModel, определенный в отдельном файле cs, и еще один класс ImageViewModel в отдельном файле cs; Мне интересно, могу ли я в любом случае вызвать операцию в MainWindow из ImageViewModel. Более подробная информация указана ниже:

  • в ImageViewModel вызовите изменение в MainWindow следующим образом (следующий код в MainWindow):

    this.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,
                    new Action(
                        delegate()
                        {
                                ((SetupViewModel)this.DataContext).ViewType = Convert.ToInt32(ViewTypes.ViewType2D);
                        }
                    )
                );
    
  • Переменная ViewType определена в SetupViewModel следующим образом

    private int _viewType;
        public int ViewType
        {
            get
            {
                return _viewType;
            }
            set
            {
                _viewType = value;
                OnPropertyChanged("ViewType");
            }
        }
    
  • Вот как я это сделал, но безуспешно; Код вызова в ImageViewModel:

    try { Действие SwitchTo2DView = делегат() { ((CaptureSetupViewModel)System.Windows.Application.Current.MainWindow.DataContext).ViewType = Convert.ToInt32(ViewTypes.ViewType2D); };

                System.Windows.Application.Current.MainWindow.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, SwitchTo2DView);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Caught exception: " + ex.ToString());
            }
    

и исключение:

System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at CaptureSetupDll.ViewModel.LiveImageViewModel.<StartZStackPreview>b__2c()
   --- End of inner exception stack trace ---
   at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Delegate.DynamicInvokeImpl(Object[] args)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   at System.Windows.Threading.DispatcherOperation.InvokeImpl()
   at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Windows.Threading.DispatcherOperation.Invoke()
   at System.Windows.Threading.Dispatcher.ProcessQueue()
   at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.WrappedInvoke(Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method, Object arg)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
   at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
   at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
   at System.Windows.Threading.DispatcherOperation.Wait(TimeSpan timeout)
   at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter)
   at System.Windows.Threading.Dispatcher.Invoke(DispatcherPriority priority, Delegate method)
   at CaptureSetupDll.ViewModel.LiveImageViewModel.StartZStackPreview()

Я непрофессионал в С#; Любая идея, как я могу сделать эту работу? Большое спасибо.


  • Что такое InnerException и его трассировка стека? 07.05.2013
  • Эта информация будет представлена ​​в окне исключения, которое отображается, когда открыта Visual Studio. То, что вы делаете, - это правильный способ вызвать MainWindow из второго потока. 07.05.2013
  • Я добавляю добавить картинку, чтобы показать вам, что я вижу. 07.05.2013
  • @Ramhound: Да, наверное, я очень запутался, поэтому я ищу помощи. 07.05.2013
  • @SLaks: я опубликовал то, что вижу, поможет ли это в любом случае? 07.05.2013
  • @NickTsui - Вы пытались поймать исключение? Это не обычное диалоговое окно пойманного исключения. 07.05.2013
  • @Ramhound: как поймать исключение? 07.05.2013
  • ОК, я попытался поймать исключение, я не уверен, поможет ли это в любом случае, но я вышел из оригинальной ветки. Вроде какая-то информация есть. 07.05.2013
  • @NickTsui - вы должны обновить вопрос с помощью текущего кода с перехватом исключений. Не могли бы вы также указать, какая именно строка вызывает исключение. Судя по исключению, похоже, что у вас есть ссылка на нулевое исключение для одной из ваших Windows. 07.05.2013
  • Вы должны использовать эту вещь, называемую отладчиком. Во время работы программы вы выполняете код. В конце концов вы найдете точку, в которой при переходе от одной строки к другой выполнение останавливается/перескакивает куда-то неожиданно/заканчивается. Здесь происходит исключение. Повторно запустите, а затем прямо перед этим моментом посмотрите на экземпляры/свойства/методы, которых коснулись. Один из них будет нулевым. Или внутри метода/геттера/сеттера они будут касаться нуля. Это либо ваше решение, либо ваш реальный вопрос. 07.05.2013
  • Готов поспорить на пять баксов, что ваш DataContext равен нулю во время вызова. Это означает, что его, вероятно, вызывают слишком рано. Это, вероятно, означает, что вы должны отталкивать все, что вы делаете, в Dispatcher, пока приложение не будет загружено. Все это, вероятно, слишком продвинуто для вас сейчас. 07.05.2013
  • @Will Вы правы, DataContext равен нулю! Но я думаю, что мое приложение уже загружается в этот момент? 07.05.2013
  • @NickTsui: Эй, где мои пять баксов?!?! На данный момент ваше приложение загружено не полностью. Вы должны сначала проверить значение null перед доступом. Я не знаю, что запускает этот метод или когда, но он может запускаться более одного раза при загрузке формы. Так что сделайте свою проверку, и если нулевой возврат. Если это не решит проблему, вам придется проверить значение null, а если значение null, отбросить действие в диспетчере, которое повторит попытку позже (например, когда приложение находится в режиме ожидания). Прочитайте это: msdn.microsoft.com/en-us/magazine/cc163328.aspx 07.05.2013
  • @Буду; Большое спасибо. Я хотел бы пригласить вас на чашку кофе за 5 долларов; Если вы случайно приедете в Теннесси. Оставьте мне сообщение. Я посмотрю на это, и я также постараюсь обойти это. Поэтому, если вы можете опубликовать свой ответ здесь, я приму его. Спасибо еще раз! 07.05.2013

Ответы:


1

Готов поспорить на пять баксов, что ваш DataContext равен нулю во время вызова. Это означает, что его, вероятно, вызывают слишком рано. Это, вероятно, означает, что вы должны отправить все, что вы делаете, в Dispatcher.

Хотя вы можете предполагать, что ваше приложение полностью загружено в момент вызова этого метода, это не всегда так. Чтобы проверить это, установите точку останова во время отладки и проверьте DataContext, чтобы убедиться, что она равна нулю.

Если он равен нулю, у вас есть два варианта. Во-первых, просто вернуться. В зависимости от того, как вызывается метод, он может вызываться несколько раз во время загрузки. Более поздний вызов может выявить ненулевой контекст.

Другой вариант — использовать Диспетчер для повторно вызовите метод позже, после загрузки приложения.

Вот небольшой псевдокод, который выглядит как C# и может даже компилироваться:

public void CheckTheDataContext()
{
    // is it null?
    if(this.DataContext == null)
    {
        // then drop an Action re-invoking this method later
        // when the application idles out a bit
        Dispatcher.BeginInvoke((Action)(() =>
        {
            CheckTheDataContext();
        }), System.Windows.Threading.DispatcherPriority.ApplicationIdle);
        return;
    }
    DoSomethingElseWithTheContext(DataContext);
}
07.05.2013
  • Это имеет смысл. Большое спасибо Уиллу :) 08.05.2013
  • Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..