UWP c#从类访问MainPage文本块

时间:2018-10-19 13:38:35

标签: c# class xaml user-interface uwp

在XAML主页上,我有一个CommandBar,可用来显示应用程序的主按钮和消息区域。看起来像这样:

      <CommandBar x:Name="topcmdbar" Grid.Column="0 " Grid.ColumnSpan="3" 
                IsDynamicOverflowEnabled="False" ClosedDisplayMode="Compact" 
                VerticalAlignment="Top" Opacity=".5" 
                Background="Transparent" Visibility="Visible" 
                >
        <CommandBar.Content>
            <Grid >
                <TextBlock  x:Name="TopCmdBarContent" x:FieldModifier="public" HorizontalAlignment="Left" Margin="10,5,0,0" VerticalAlignment="Stretch"/>
            </Grid>
        </CommandBar.Content>
        <AppBarButton FontFamily="Segoe MDL2 Assets" Content="&#xE838;" FontSize="18"  Label="Open Folder" Tapped="StartNewPlaylist" HorizontalAlignment="Left"/>
        <AppBarButton  etc etc etc........

我有一个可以在其中加载应用程序文件的类。我想从该类中显示TopCmdBarContent上的加载进度。

为此,我尝试了各种策略。将MainPage作为参数传递给初始化该类的方法,但我无法访问它。我什至考虑过要在类中创建自己的“进度”消息,但随后我需要从主页访问网格以将其挂起。...

因此,例如,我需要一个在类中执行类似操作的方法:

        public async void InitializePlayList()
        {   
            int countfiles=0;
            StorageFolder f = await GetSelectedFolderAsync();
            foreach (var file in f) 
                 {
                   Do_a_bunch_of_stuff(f);
                   countfiles+=1;
                   TopCmdBarContent="Hang in there, "countfiles.ToString()+" processed";

        }

我一直在尝试this potential solution,但始终收到以下错误消息:“应用程序调用了已编组用于另一个线程的接口。(来自HRESULT的异常:0x8001010E)”

你知道我该怎么做吗?

2 个答案:

答案 0 :(得分:0)

这与MVVM模式有关。但并不复杂。

  1. 安装MvvmLightLibs Nuget软件包。
  2. 在MainPage.xaml.cs构造函数方法中注册消息侦听器。

    GalaSoft.MvvmLight.Messaging.Messenger.Default.Register(this, "count_changed", (value) =>
            {
                TopCmdBarContent.Text = "What ever you want";
            });
  1. 在您的InitializePlayList()方法中,发送消息

    公共异步void InitializePlayList() { //您的处理代码 .... .... ... GalaSoft.MvvmLight.Messaging.Messenger.Default.Send(count.ToString(),“ count_changed”); }

  2. 仅此而已

实际上,您可以使用EventHandler来完成这些操作,但是为了方便起见,在这里我建议您使用MvvvmLightLibs

答案 1 :(得分:0)

好吧......终于得到了.....流汗了很多,并说了很多坏话。

两种方法都可以工作(传递对TextBlock的引用或使用WMMW消息,但这是对调度程序的调用是错误的。这是正确的语法,以防它对某人有所帮助:

      Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => {MessagePad = "blablabla";});

这东西的语法!

我已经使用无数种编程语言进行编程已有40多年了,我不敢相信有人认为这将是用一种新的现代编程语言c#讲这种语言的正确方法! ....上帝....来自加拿大,我现在可以合法地说,这个家伙一定在抽一些非常非常好的杂草.....让我想念COBOL!