在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="" 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)”
你知道我该怎么做吗?
答案 0 :(得分:0)
这与MVVM模式有关。但并不复杂。
GalaSoft.MvvmLight.Messaging.Messenger.Default.Register(this, "count_changed", (value) =>
{
TopCmdBarContent.Text = "What ever you want";
});
在您的InitializePlayList()方法中,发送消息
公共异步void InitializePlayList() { //您的处理代码 .... .... ... GalaSoft.MvvmLight.Messaging.Messenger.Default.Send(count.ToString(),“ count_changed”); }
仅此而已
实际上,您可以使用EventHandler来完成这些操作,但是为了方便起见,在这里我建议您使用MvvvmLightLibs
答案 1 :(得分:0)
好吧......终于得到了.....流汗了很多,并说了很多坏话。
两种方法都可以工作(传递对TextBlock的引用或使用WMMW消息,但这是对调度程序的调用是错误的。这是正确的语法,以防它对某人有所帮助:
Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () => {MessagePad = "blablabla";});
这东西的语法!
我已经使用无数种编程语言进行编程已有40多年了,我不敢相信有人认为这将是用一种新的现代编程语言c#讲这种语言的正确方法! ....上帝....来自加拿大,我现在可以合法地说,这个家伙一定在抽一些非常非常好的杂草.....让我想念COBOL!