繁体   English   中英

UWP c#从类访问MainPage文本块

[英]UWP c# Accessing a MainPage Textblock from a class

在主页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";

        }

我一直在尝试这种潜在的解决方案,但始终收到此错误:“该应用程序调用了已编组用于另一个线程的接口。(来自HRESULT的异常:0x8001010E)”

知道我该怎么做吗?

这一点与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()方法中,发送消息

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

  2. 就这样

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

好....终于明白了.....经过大量的出汗并说了很多坏话。

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

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

这东西的语法!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM