2017-07-17 49 views
0

編程新手,經過7天的搜索後,我找不到解決方案。 我的「MainPage」打開,我點擊打開一個「SecondaryPage」,它在帶有核心Dispatcher的新線程窗口上打開。我的「MainPage」有一個更新「TextBlock1」的按鈕Click事件。我無法實現的是將此值傳遞給我的「第二頁」「TextBlock2」。UWP C#將變量傳遞給另一個線程

MainPage.xaml在下面。

<StackPanel> 
    <Button Click="Button_Click_NewWindow" Content="Start a new window" FontSize="30"/> 
    <TextBlock Name="Textblock1" Text="Empty" FontSize="30"/> 
    <Button Click="Button_Click_Add" Content="+1" FontSize="30"/> 
</StackPanel> 

代碼SecondPage.xaml背後

<StackPanel> 
    <TextBlock Name="Textblock2" Text="Empty" FontSize="30"/> 
</StackPanel> 

MainPage.xaml.cs中

namespace MulitViewV1 
{ 

    public sealed partial class MainPage : Page 
    { 
     public int T1G = 0; 


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

     private async void Button_Click_NewWindow(object sender, RoutedEventArgs e) 
     { 
      CoreApplicationView newView = CoreApplication.CreateNewView(); 
      int newViewId = 0; 
      await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
      { 
       Frame frame = new Frame(); 
       frame.Navigate(typeof(SecondPage), null); 
       Window.Current.Content = frame; 
       // You have to activate the window in order to show it later. 
       Window.Current.Activate(); 

       newViewId = ApplicationView.GetForCurrentView().Id; 
      }); 
      bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId); 
     } 

     private async void Button_Click_Add(object sender, RoutedEventArgs e) 
     { 
      T1G = T1G + 1; 
      Textblock1.Text = T1G.ToString(); 

      await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,() => 
      { 
       //UI code here 
       // NOT WORKING error "TextBlock2" does not exist in the current context 
       Textblock2.Text = T1G.ToString(); 
      }); 

     } 
    } 
} 

我看到調度員正在我查看的MainPage,但我不能想出代碼直接它到我的第二頁「newViewID」。

回答

0

在你Button_Click_NewWindow,你在呼喚

frame.Navigate(typeof(SecondPage), null); 

,而不是零,從TextBlock通過文字像下面

string TextBoxText = Textblock1.Text; 
frame.Navigate(typeof(SecondPage), TextBoxText); 

而在你SecondPage,覆蓋OnNavigated的方法,你可以得到的文字如下。

string PassedText=e.parameter.ToString(); 

,你可以分配給你的TextBlock如下

Textblock2.Text=PassedText; 

更新

更改Button_Click_NewWindow以下,並添加頂部的兩個變量。

int newViewId = 0; 
Window SecondWindow; 
private async void Button_Click_NewWindow(object sender, TappedRoutedEventArgs e) 
{ 
    string TextBoxText = Textblock1.Text; 
    int mainViewId = ApplicationView.GetApplicationViewIdForWindow(CoreApplication.MainView.CoreWindow); 
    if (newViewId == 0) 
    { 
     CoreApplicationView newCoreView = CoreApplication.CreateNewView(); 
     ApplicationView newAppView = null; 
     await newCoreView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
     { 
      newAppView = ApplicationView.GetForCurrentView(); 
      Window.Current.Content = new Frame(); 
      (Window.Current.Content as Frame).Navigate(typeof(SecondPage), TextBoxText); 
      Window.Current.Activate(); 
      SecondWindow = Window.Current; 
     }); 
     newViewId = newAppView.Id; 
    } 
    else 
    { 
     await SecondWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
     { 
      SecondWindow.Content = new Frame(); 
      (SecondWindow.Content as Frame).Navigate(typeof(SecondPage), TextBoxText); 
      SecondWindow.Activate(); 
     }); 

    } 
    await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId, ViewSizePreference.UseHalf, mainViewId, ViewSizePreference.UseHalf); 
} 

而且你的輸出

enter image description here

+0

感謝您的支持與我,我到了那裏。在我的Button_Click_NewWindow,它打開第二個窗口。代碼::frame.Navigate(typeof(SecondPage),T1G);並傳遞變量。然後我的Button_Click_Add,我如何將新的更新變量傳遞給第二個打開的窗口? – Static

+0

@Static查看我的更新回答 – AVK

+0

我無法感謝你,我一直想堅持一個星期試圖弄清楚這一點。 – Static

1

有沒有必要打電話Dispatcher所有的時間。你在UI線程上點擊你的按鈕,所以處理程序也將在UI線程上。

一種想法是,你總是在UI線程上,除非你正在使用*Async做一些事情。如果你等待異步的東西,你很好。這在所有的時間都不是真實的,但它是一個開始和處理你可能遇到的問題的地方。

通常,您只需要在應用程序中使用單個Frame。多個Frames(和多個窗口)是一個高級主題;保存以備後用。

默認情況下,您的UWP應用程序將包含一個Frame。頁面託管在此框架中。該框架可以在其託管的頁面之間導航。將瀏覽器窗口視爲框架,頁面就像網頁一樣。

您可以通過獲取頁​​面上的Frame屬性來獲得Frame。導航到一個新的頁面,你這樣做:

private async void Button_Click_NewWindow(object sender, RoutedEventArgs e) 
{ 
    Frame.Navigate(typeof(SecondPage), null); 
} 

接下來,你要改變TextBlock2文本。 TextBlock2位於SecondPage,但您的代碼位於MainPage,它沒有TextBlock2,編譯器告訴您TextBlock2不在MainPage中。

在您的SecondPage.xaml.cs內部,您可以到達TextBlock2,因爲它在那裏。請記住,導航到SecondPageMainPage將不可見(正如從一個導航到另一個導航時看不到兩個網頁一樣)。