По сути, я полностью скопировал это: https://github.com/AvaloniaUI/Avalonia .Samples/tree/main/src/Avalonia.Samples/Routing/BasicViewLocatorSample
Однако с другими именами и т. д., потому что я не клонировал его, а просто скопировал и вставил с измененными именами по мере необходимости. Когда я запускаю это, приложение работает нормально, но когда я нажимаю кнопку, чтобы перейти на следующую страницу, оно выдает:
Код: Выделить всё
2024-10-04 22:33:57.166 InfiniteConnect.Desktop[1179:12555] +[IMKClient subclass]: chose IMKClient_Legacy
2024-10-04 22:33:57.166 InfiniteConnect.Desktop[1179:12555] +[IMKInputSession subclass]: chose IMKInputSession_Legacy
Unhandled exception. System.InvalidOperationException: Call from invalid thread
at Avalonia.Threading.Dispatcher.g__ThrowVerifyAccess|16_0()
at Avalonia.AvaloniaObject.GetValue[T](StyledProperty`1 property)
at Avalonia.Controls.Button.get_Command()
at Avalonia.Controls.Button.CanExecuteChanged(Object sender, EventArgs e)
at ReactiveUI.ReactiveCommandBase`2.OnCanExecuteChanged(Boolean newValue) in c:\temp\releaser\ReactiveUI\src\ReactiveUI\ReactiveCommand\ReactiveCommandBase.cs:line 144
at System.Reactive.AnonymousSafeObserver`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.IdentitySink`1.OnNext(T value)
at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive(Int32 count)
at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive()
at System.Reactive.Subjects.ReplaySubject`1.ReplayBase.OnNext(T value)
at System.Reactive.Subjects.ReplaySubject`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.IdentitySink`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.Linq.ObservableImpl.DistinctUntilChanged`2._.OnNext(TSource value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.Linq.ObservableImpl.CombineLatest`3._.SecondObserver.OnNext(TSecond value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.IdentitySink`1.OnNext(T value)
at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive(Int32 count)
at System.Reactive.Subjects.FastImmediateObserver`1.EnsureActive()
at System.Reactive.Subjects.ReplaySubject`1.ReplayBase.OnNext(T value)
at System.Reactive.Subjects.ReplaySubject`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.IdentitySink`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.Linq.ObservableImpl.DistinctUntilChanged`2._.OnNext(TSource value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.IdentitySink`1.OnNext(T value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.Linq.ObservableImpl.Select`2.Selector._.OnNext(TSource value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.Linq.ObservableImpl.Scan`2._.OnNext(TSource value)
at System.Reactive.SafeObserver`1.WrappingSafeObserver.OnNext(TSource value)
at System.Reactive.Sink`1.ForwardOnNext(TTarget value)
at System.Reactive.ObserveOnObserverLongRunning`1.Drain()
at System.Reactive.ObserveOnObserverLongRunning`1.c.b__17_0(ObserveOnObserverLongRunning`1 self, ICancelable cancelable)
at System.Reactive.Concurrency.DefaultScheduler.LongRunning.LongScheduledWorkItem`1.c.b__3_0(Object thisObject)
at System.Reactive.Concurrency.ConcurrencyAbstractionLayerImpl.c.b__8_0(Object itemObject)
at System.Threading.Thread.StartCallback()
Process finished with exit code 134.
Вот текущий код:
MainViewModel.cs
Код: Выделить всё
using DynamicData;
using ReactiveUI;
using System.Windows.Input;
namespace InfiniteConnect.ViewModels
{
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
// Set current page to first on start up
_CurrentPage = Pages[0];
// Create Observables which will activate to deactivate our commands based on CurrentPage state
var canNavNext = this.WhenAnyValue(x => x.CurrentPage.CanNavigateNext);
var canNavPrev = this.WhenAnyValue(x => x.CurrentPage.CanNavigatePrevious);
NavigateNextCommand = ReactiveCommand.Create(NavigateNext, canNavNext);
NavigatePreviousCommand = ReactiveCommand.Create(NavigatePrevious, canNavPrev);
}
// A read.only array of possible pages
private readonly PageViewModelBase[] Pages =
{
new HomeViewModel(),
new JoystickViewModel(),
new ThirdPageViewModel()
};
// The default is the first page
private PageViewModelBase _CurrentPage;
///
/// Gets the current page. The property is read-only
///
public PageViewModelBase CurrentPage
{
get { return _CurrentPage; }
private set { this.RaiseAndSetIfChanged(ref _CurrentPage, value); }
}
///
/// Gets a command that navigates to the next page
///
public ICommand NavigateNextCommand { get; }
private void NavigateNext()
{
// get the current index and add 1
var index = Pages.IndexOf(CurrentPage) + 1;
// /!\ Be aware that we have no check if the index is valid. You may want to add it on your own. /!\
CurrentPage = Pages[index];
}
///
/// Gets a command that navigates to the previous page
///
public ICommand NavigatePreviousCommand { get; }
private void NavigatePrevious()
{
// get the current index and subtract 1
var index = Pages.IndexOf(CurrentPage) - 1;
// /!\ Be aware that we have no check if the index is valid. You may want to add it on your own. /!\
CurrentPage = Pages[index];
}
}
}
Код: Выделить всё
using ReactiveUI;
using System;
namespace InfiniteConnect.ViewModels;
public class HomeViewModel : PageViewModelBase
{
public string Title => "Welcome to our Wizard-Sample.";
///
/// The content of this page
///
public string Message => "Press \"Next\" to register yourself.";
// This is our first page, so we can navigate to the next page in any case
public override bool CanNavigateNext
{
get => true;
protected set => throw new NotSupportedException();
}
// You cannot go back from this page
public override bool CanNavigatePrevious
{
get => false;
protected set => throw new NotSupportedException();
}
}
Код: Выделить всё
await Dispatcher.UIThread.InvokeAsync(() => {});
Я относительно новичок в C#, поэтому любые советы или ответы, почему это происходящее будет оценено по достоинству. Это разрабатывается в Rider.
Спасибо!
Подробнее здесь: https://stackoverflow.com/questions/790 ... read-error