无法在Windows Phone应用程序的列表框中动态添加按钮控件

时间:2012-01-02 05:26:49

标签: wpf silverlight windows-phone-7.1

我试图在Windows Phone应用程序的列表框中动态添加几个按钮控件。当我在代码中添加这些控件并运行应用程序时,我得到一个异常,说“无效的跨线程访问”。以下是我的xaml和xaml.cs代码。

       <StackPanel>
                <ListBox x:Name="TripList" Height="465" HorizontalAlignment="Left" VerticalAlignment="Top" Width="456" Background="White" Foreground="Blue">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <Border BorderBrush="Black" BorderThickness="0,0,0,4">
                                <StackPanel Orientation="Vertical" Width="456">
                                    <StackPanel Orientation="Vertical">
                                        <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                            <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" Width="370" FontSize="24" Text="{Binding PUDetails}"/>
                                            <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Right" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="24" Text="{Binding TripStatus}"/>
                                        </StackPanel>
                                        <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                            <StackPanel VerticalAlignment="Top" Orientation="Horizontal" Width="300">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Conf: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding ConfNumber}"/>
                                            </StackPanel>
                                            <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Right" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Est Do Tm: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Right" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding DOTime}"/>
                                            </StackPanel>
                                        </StackPanel>
                                        <StackPanel VerticalAlignment="Top" Orientation="Vertical">
                                            <StackPanel Background="Azure" Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Top">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Svc: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding TripService}"/>
                                            </StackPanel>
                                            <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="PU: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding PURoute}"/>
                                            </StackPanel>
                                            <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="DO: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding DORoute}"/>
                                            </StackPanel>
                                            <StackPanel VerticalAlignment="Top" Orientation="Horizontal">
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="Pax: "/>
                                                <TextBlock FontWeight="Bold" Foreground="Black" HorizontalAlignment="Left" TextWrapping="Wrap"  VerticalAlignment="Top" FontSize="18" Text="{Binding PaxDetails}"/>
                                            </StackPanel>
                                        </StackPanel>
                                    </StackPanel>
                                    <StackPanel x:Name="stknotchecked" VerticalAlignment="Top" Orientation="Vertical">


                                    </StackPanel><StackPanel x:Name="stkaccepted"></StackPanel>                                    </StackPanel>
                            </Border>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
            </StackPanel>

我需要将动态生成的控件添加到“stkbuttons”面板。

  System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
                    {
                        TripList.ItemsSource = TripsListdata;

                       if (Tripaccept == "Accepted")
                        {
                            StackPanel stktest = FindDescendant<StackPanel>(TripList);


                            if (stktest.Name == "stkaccepted")
                            {

                            }
                        }
                        else
                        {
                            StackPanel stktest = FindDescendant<StackPanel>(TripList);

                            if(stktest.Name == "stknotchecked")
                           {

                            }
                        }

                    });
 private T FindDescendant<T>(DependencyObject parentElement) where T : FrameworkElement
    {
        var count = VisualTreeHelper.GetChildrenCount(parentElement);
        if (count == 0)
            return null;

        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(parentElement, i);

            if (child != null && child is T)
            {
                return (T)child;
            }
            else
            {
                var result = FindDescendant<T>(child);
                if (result != null)
                    return result;

            }
        }
        return null;
    }

以下是异常的堆栈跟踪..

at MS.Internal.XcpImports.CheckThread()
at System.Windows.DependencyObject..ctor(UInt32 nativeTypeIndex, IntPtr constructDO)
at System.Windows.DependencyObject..ctor(UInt32 nativeTypeIndex)
at System.Windows.Media.Brush..ctor(UInt32 nKnownTypeIndex)
at System.Windows.Media.SolidColorBrush..ctor()
at System.Windows.Media.SolidColorBrush..ctor(Color color)
at DriverAnywhere.MyTrips.ResponseCallBackTrips(IAsyncResult result)
at System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.    <InvokeGetResponseCallback>b__8(Object state2)
at System.Threading.ThreadPool.WorkItem.WaitCallback_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadPool.WorkItem.doWork(Object o)
at System.Threading.Timer.ring()

有人可以帮我解决问题吗?...提前致谢..

1 个答案:

答案 0 :(得分:1)

Webservices回调在单独的线程上。并且你不能从ui线程以外的任何线程访问ui元素。要从ui访问ui中的元素,必须打电话给你 Dispatcher.BeginInvoke

Dispatcher.CurrentDispatcher.Invoke

了解更多信息,请查看此内容 http://msdn.microsoft.com/en-us/magazine/cc163328.aspx

编辑:

Dispatcher.Invoke(
          System.Windows.Threading.DispatcherPriority.Normal,
          new Action(
            delegate()
            {
                //you code here to load items in listbox
            }
        ));

问候。