小编Jef*_*f R的帖子

如何在Windows Phone 7的后台线程上运行函数?

我正在使用MVVM Light来构建WP7(Windows Phone 7)应用程序.我希望模型执行的所有工作都在后台线程上运行.然后,完成工作后,引发一个事件,以便ViewModel可以处理数据.

我已经发现我无法从WP7应用程序异步调用委托.

目前我正在尝试使用ThreadPool.QueueUserWorkItem()在后台线程上运行一些代码,并使用MVVM Light的DispatcherHelper.CheckBeginInvodeOnUI()在UI线程上引发一个事件,以通知ViewModel数据已被加载(这会导致VS2010崩溃)和Blend 4在尝试显示设计时视图时).

是否有任何示例代码在后台线程上运行某些代码,然后将事件调度回UI线程以获取WP7应用程序?

杰夫,先谢谢你.

编辑 - 这是一个示例模型

public class DataModel
{
    public event EventHandler<DataLoadingEventArgs> DataLoadingComplete;
    public event EventHandler<DataLoadingErrorEventArgs> DataLoadingError;
    List<Data> _dataCasch = new List<Data>();

    public void GetData()
    {
        ThreadPool.QueueUserWorkItem(func =>
        {
            try
            {
                LoadData();
                if (DataLoadingComplete != null)
                {
                    //Dispatch complete event back to the UI thread
                    DispatcherHelper.CheckBeginInvokeOnUI(() =>
                    {
                       //raise event 
                        DataLoadingComplete(this, new DataLoadingEventArgs(_dataCasch));
                    });
                }
            }
            catch (Exception ex)
            {
                if (DataLoadingError != null)
                {
                    //Dispatch error event back to the UI …
Run Code Online (Sandbox Code Playgroud)

c# multithreading compact-framework windows-phone-7 mvvm-light

11
推荐指数
1
解决办法
1万
查看次数

处理ViewModel中的OnNavigatedFrom/OnNavigatedTo事件

我试图找出一种方法让我的ViewModel处理页面导航时从或从中保存或恢复页面的状态.

我尝试的第一件事是向页面添加EventToCommand行为,但事件(OnNavigatedFrom和OnNavigatedTo)被声明为受保护,并且EventToCommand没有看到要绑定的事件.

接下来我想我会尝试使用Messenger类使用View后面代码中的代码将消息传递给ViewModel:

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    Messenger.Default.Send<PhoneApplicationPage>(this);
    base.OnNavigatedFrom(e);
}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    Messenger.Default.Send<PhoneApplicationPage>(this); 
    base.OnNavigatedTo(e);
}
Run Code Online (Sandbox Code Playgroud)

但这似乎有两个问题,首先是在代码隐藏页面中使用此代码.其次,ViewModel无法区分OnNavigatedFrom和OnNavigatedTo事件,而无需为PhoneApplicationPage对象创建一个包装类(请参阅下面的更新).

什么是MVVM-Light最友好的方式来处理这些事件?

更新:我能够通过发送这样的消息来解决第二个问题:

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{
    Messenger.Default.Send<PhoneApplicationPage>(this,"NavigatedFrom");
    base.OnNavigatedFrom(e);
}

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
    Messenger.Default.Send<PhoneApplicationPage>(this, "NavigatedTo"); 
    base.OnNavigatedTo(e);
}
Run Code Online (Sandbox Code Playgroud)

并像这样注册它们:

Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedFrom", false, (action) => SaveState(action));
Messenger.Default.Register<PhoneApplicationPage>(this, "NavigatedTo", false, (action) => RestoreState(action));
Run Code Online (Sandbox Code Playgroud)

windows-phone-7 mvvm-light

10
推荐指数
2
解决办法
1万
查看次数

WP7 ListBox项目填充ListBox的宽度

我试图让ListBox中的Items跨越ListBox的整个宽度.我发现了几个处理Horizo​​ntalContentAlignment ="Stretch"的帖子,但我无法让它在我的WP7应用程序中运行.这是我的ListBox:

<ListBox Margin="8" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Collection}" >
    <ListBox.ItemTemplate>
        <DataTemplate> 
            <Border BorderBrush="Black" CornerRadius="3" Background="#FFE88D34" 
                BorderThickness="1" HorizontalAlignment="Stretch" > 
                <Grid Background="Transparent" HorizontalAlignment="Stretch" > 
                    <Grid.ColumnDefinitions> 
                        <ColumnDefinition Width="*" /> 
                    </Grid.ColumnDefinitions> 
                    <TextBlock  
                        Grid.Column="0" HorizontalAlignment="Stretch" 
                        Margin="2"                                    
                        FontSize="10" 
                        Text="{Binding Property1}"/> 
                </Grid> 
             </Border> 
        </DataTemplate> 
    </ListBox.ItemTemplate>
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
Run Code Online (Sandbox Code Playgroud)

我试图让橙色边框跨越列表框的整个宽度,以便所有列表项的大小相同,而不仅仅是TextBlock中文本的大小.

listbox datatemplate windows-phone-7

5
推荐指数
3
解决办法
7794
查看次数