Как получить определенный контроль пользовательского интерфейса из двух классов - PullRequest
0 голосов
/ 31 декабря 2018

Я разрабатываю приложение UWP с двумя страницами окна на двух отдельных экранах.

Включено:

  • Mainpage.xaml
  • Mainpage.xaml.cs
  • Page2.xaml
  • Page2.xaml.cs

Мой сценарий:

  1. получить положение мыши (X) при перемещении на дополнительном экране (Page2).
  2. записать его в текстовом блоке на первом экране (MainPage), Одновременно изменить.

В MainPage.xaml

<Page
    x:Class="LineDraw.MainPage"
    xmlns:local="using:LineDraw"
    ...
    ..

    <Grid>

    <TextBlock Name="textblock" Text="N/A" HorizontalAlignment="Stretch" VerticalAlignment="Top" Margin="100" />

    </Grid>
</Page>

In MainPage.xaml.cs

 public sealed partial class MainPage : Page
    {   
        public double Xpage2;

        public MainPage()
        {
            this.InitializeComponent();
            newpage();   
        }

        private async void newpage()
        { 
            int NewWindowid = 0;
            int Windowid = ApplicationView.GetForCurrentView().Id;
            CoreApplicationView newView = CoreApplication.CreateNewView();
            await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
            {
                Frame newframe = new Frame();
                newframe.Navigate(typeof(Page2), this); // this means existing MainPage object.
                Window.Current.Content = newframe;
                Window.Current.Activate();
                NewWindowid = ApplicationView.GetForCurrentView().Id;
            });

             bool available = ProjectionManager.ProjectionDisplayAvailable;

             ProjectionManager.ProjectionDisplayAvailableChanged += (s, e) =>
             {
               available = ProjectionManager.ProjectionDisplayAvailable;
             };

            await ProjectionManager.StartProjectingAsync(NewWindowid, Windowid);
        }

        public void copyX(double Xpage2)
        {
            textblock.Text = $"X = {Xpage2}";  
        }
}

In Page2.xaml.cs

 public sealed partial class Page2 : Page
    {      
        MainPage mainpage;
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            mainpage = e.Parameter as MainPage;
            base.OnNavigatedTo(e);
        }

        public Page2()
        {
            this.InitializeComponent();    
            Window.Current.CoreWindow.PointerMoved += CoreWindow_PointerMoved;    
        }

        public void CoreWindow_PointerMoved(CoreWindow sender, PointerEventArgs args)
        {
            Point ptr = args.CurrentPoint.Position;
            double Xpage2 = ptr.X;
            mainpage.copyX(Xpage2);

        }

Я сделал приведенный выше код, но в результате получается следующая ошибка:

System.Exception
  HResult=0x8001010E
  Message=The application called an interface that was marshalled for a different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))
  Source=<Cannot evaluate the exception source>
  StackTrace:
<Cannot evaluate the exception stack trace>

Я хочу получить textblock (элемент управления пользовательского интерфейса) в main.xaml из Page2.xaml.cs.Мне нужно решение, как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Для вашего сценария лучшим способом является отправка сообщения через MessagingCenter.MessagingCenter используется для передачи параметра между двумя классами.И у меня есть пример базы кода для вашего кода, на который вы могли бы ссылаться.

MainPage.Xaml.cs

private async void newpage()
{
    int NewWindowid = 0;
    int Windowid = ApplicationView.GetForCurrentView().Id;
    CoreApplicationView newView = CoreApplication.CreateNewView();
    await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        Frame newframe = new Frame();
        newframe.Navigate(typeof(OtherPage), this); // this means existing MainPage object.
        Window.Current.Content = newframe;
        Window.Current.Activate();
        NewWindowid = ApplicationView.GetForCurrentView().Id;
    });

    bool available = ProjectionManager.ProjectionDisplayAvailable;

    ProjectionManager.ProjectionDisplayAvailableChanged += (s, e) =>
    {
        available = ProjectionManager.ProjectionDisplayAvailable;
    };

    await ProjectionManager.StartProjectingAsync(NewWindowid, Windowid);
    SubMessage();
}

private void SubMessage()
{
    MessagingCenter.Subscribe<OtherPage, string>(this, "Tag", async (s, arg) =>
    {
       await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            textblock.Text = arg;
        });

    });
}

OtherPage.Xaml.cs

public OtherPage()
{
    this.InitializeComponent();
    Window.Current.CoreWindow.PointerMoved += CoreWindow_PointerMoved;
}

public void CoreWindow_PointerMoved(CoreWindow sender, PointerEventArgs args)
{
    Point ptr = args.CurrentPoint.Position;
    double Xpage2 = ptr.X;
    MessagingCenter.Send<OtherPage, string>(this, "Tag", Xpage2.ToString());
}

И вы можете скопировать класс MessagingCenter непосредственно по приведенной выше ссылке.Для более подробной информации вы можете обратиться к MessagingCenter официальный документ .

0 голосов
/ 31 декабря 2018

Вы пытаетесь запустить метод (mainpage.copyX ()), который был запущен в другом контексте.Я не знаю, почему вы создали другое представление, если вы можете просто запустить этот код в MainView CoreApplication.В MainPage.xmal.cs:

await CoreApplication.MainView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
     Frame newframe = new Frame();
     newframe.Navigate(typeof(Page2), this);
     Window.Current.Content = newframe;
     Window.Current.Activate();
     NewWindowid = ApplicationView.GetForCurrentView().Id;
});

await CoreApplication.MainView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
     Point ptr = args.CurrentPoint.Position;
     double Xpage2 = ptr.X;
     mainpage.copyX(Xpage2);
});

Если вы создаете другое представление, вам нужно как-то поделиться этим ресурсом, чтобы все выполнялись в одном и том же контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...