none
请教如何显示一个正在执行的信息框 RRS feed

  • 问题

  • 我在silverlight中使用一个按钮作为保存事件触发
    this.cmdSave.Click += new RoutedEventHandler(cmdSave_Click);

    public void cmdSave_Click(object sender, RoutedEventArgs e)
    {
    // 希望先显示下面的gdMessage 再执行以下功能
    gdMessage.SetValue(Canvas.ZIndexProperty, 1);
    // 上面的没有起到作用, 而是在数据保存完了后才显示出来,
    请问我该如何处理,本准备把上面那句话放在线程里,结果又提示
    cross thread


    // 例如保存数据.. 需要长时间的操作

    }

    <Grid x:Name="gdMessage" Opacity="1" Canvas.ZIndex="0" Width="663" Height="360" >
    <Rectangle Stroke="#FF000000" Opacity="0.2" Fill="#FFC8D4E6"/>
    <Rectangle Stroke="#FF000000" Margin="51,40,51,66" Fill="#FFFFFFFF"/>
    <TextBlock Text="正在进行数据分析与处理,请等待..." TextWrapping="Wrap" FontSize="20" Margin="90,103,106.359,125"/>
    <Button Height="25" Width="48" Content="关闭" x:Name="btnClose" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,32,61,0"/>
    </Grid>


    抱歉,新手请多指教,是否有其他更加简单的方案?
    2009年7月6日 11:51

答案

  • 不好意思.
    可以试试用BackGround Thread,类似这样:
    public void cmdSave_Click(object sender, RoutedEventArgs e)

       Thread thread = new Thread(new ThreadStart(delegate(){
                    this.Dispatcher.BeginInvoke(delegate(){
                              gdMessage.SetValue(Canvas.ZIndexProperty, 1); 
                              log.UpdateLayout();});
                    Thread.Sleep(50);
                    this.Dispatcher.BeginInvoke(delegate()
                    {
                      //// your actions
                    });
                }));
                thread.IsBackground = true;
                thread.Start();
      
      }
    2009年7月7日 16:59
  • 不好意思.
    可以试试用BackGround Thread,类似这样:
    public void cmdSave_Click(object sender, RoutedEventArgs e)

       Thread thread = new Thread(new ThreadStart(delegate(){
                    this.Dispatcher.BeginInvoke(delegate(){
                              gdMessage.SetValue(Canvas.ZIndexProperty, 1); 
                              log.UpdateLayout();});
                    Thread.Sleep(50);
                    this.Dispatcher.BeginInvoke(delegate()
                    {
                      //// your actions
                    });
                }));
                thread.IsBackground = true;
                thread.Start();
      
      }

    这个行了,非常感谢, 也感谢jv9的耐性,感谢大家
    • 已标记为答案 Tsingbegin 2009年7月8日 6:34
    2009年7月8日 1:28

全部回复

  • 做一个ChildWindow控件
    然后Click显示这个ChildWindow控件
    再执行完操作后再移除或关闭这个ChildWinodw控件

    Silverlight 3的ChildWindow很不错

    2009年7月6日 15:23
    版主
  • 做一个ChildWindow控件
    然后Click显示这个ChildWindow控件
    再执行完操作后再移除或关闭这个ChildWinodw控件

    Silverlight 3的ChildWindow很不错


    你好,我们使用的是SL2
    而且chilidwindow可能也解决不了,我们不是需要一个弹出窗体,使用弹出窗的话,后面的代码就被中断了
    我们只是希望在保存前提示正在保存,保存后关闭即可

    谢谢
    2009年7月6日 23:46
  • 写了一个简单的,自己封装好方法再设计设计样式就能当控件用了

            public Page()
            {
                InitializeComponent();
                
                MyWebClient.OpenReadCompleted += new OpenReadCompletedEventHandler(MyWebClient_OpenReadCompleted);
                Button myButtion = new Button();
                myButtion.Content = "测试";
                myButtion.Width = 40;
                myButtion.Height = 20;
                myButtion.HorizontalAlignment = HorizontalAlignment.Left;
                myButtion.VerticalAlignment = VerticalAlignment.Top;
                myButtion.Click += new RoutedEventHandler(myButtion_Click);
                LayoutRoot.Children.Add(myButtion);
                MyGrid.Background = new SolidColorBrush(Colors.Black);
                MyGrid.Opacity = 0.7;
                MyGrid.HorizontalAlignment = HorizontalAlignment.Stretch;
                MyGrid.VerticalAlignment = VerticalAlignment.Stretch;
                
                myTextBlock.Text = "正在执行";
                myTextBlock.Foreground = new SolidColorBrush(Colors.Red);
                myTextBlock.VerticalAlignment = VerticalAlignment.Center;
                myTextBlock.HorizontalAlignment = HorizontalAlignment.Center;
                myTextBlock.TextWrapping = TextWrapping.NoWrap;
                MyGrid.Children.Add(myTextBlock);
            }
            Grid MyGrid = new Grid();
            Uri myUri = new Uri("http://www.microsoft.com");
            WebClient MyWebClient = new WebClient();
            TextBlock myTextBlock = new TextBlock();
            void myButtion_Click(object sender, RoutedEventArgs e)
            {
    
                MyWebClient.OpenReadAsync(myUri);
                LayoutRoot.Children.Add(MyGrid);
            }
    
            void MyWebClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
            {
                LayoutRoot.Children.Remove(MyGrid);
            }
            
        }
    2009年7月7日 1:31
    版主
  • 写了一个简单的,自己封装好方法再设计设计样式就能当控件用了

            public Page()
    
            {
    
                InitializeComponent();
    
                
    
                MyWebClient.OpenReadCompleted += new OpenReadCompletedEventHandler(MyWebClient_OpenReadCompleted);
    
                Button myButtion = new Button();
    
                myButtion.Content = "测试";
    
                myButtion.Width = 40;
    
                myButtion.Height = 20;
    
                myButtion.HorizontalAlignment = HorizontalAlignment.Left;
    
                myButtion.VerticalAlignment = VerticalAlignment.Top;
    
                myButtion.Click += new RoutedEventHandler(myButtion_Click);
    
                LayoutRoot.Children.Add(myButtion);
    
                MyGrid.Background = new SolidColorBrush(Colors.Black);
    
                MyGrid.Opacity = 0.7;
    
                MyGrid.HorizontalAlignment = HorizontalAlignment.Stretch;
    
                MyGrid.VerticalAlignment = VerticalAlignment.Stretch;
    
                
    
                myTextBlock.Text = "正在执行";
    
                myTextBlock.Foreground = new SolidColorBrush(Colors.Red);
    
                myTextBlock.VerticalAlignment = VerticalAlignment.Center;
    
                myTextBlock.HorizontalAlignment = HorizontalAlignment.Center;
    
                myTextBlock.TextWrapping = TextWrapping.NoWrap;
    
                MyGrid.Children.Add(myTextBlock);
    
            }
    
            Grid MyGrid = new Grid();
    
            Uri myUri = new Uri("http://www.microsoft.com");
    
            WebClient MyWebClient = new WebClient();
    
            TextBlock myTextBlock = new TextBlock();
    
            void myButtion_Click(object sender, RoutedEventArgs e)
    
            {
    
    
    
                MyWebClient.OpenReadAsync(myUri);
    
                LayoutRoot.Children.Add(MyGrid);
    
            }
    
    
    
            void MyWebClient_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
    
            {
    
                LayoutRoot.Children.Remove(MyGrid);
    
            }
    
            
    
        }
    
    

    你好,非常感谢你的帮助,我可能没有太说明白,我需要在sliverlight的page里面的某个方法提供这个功能,而不是外面的其他
    程序。谢谢
    2009年7月7日 3:17
  • UserControl rootVisualPage = Application.Current.RootVisual as UserControl;
    在你的控件里写上这句,然后操作rootVisualPage
    封装个控件,方法如上,写好Show跟Hide方法就可以了
    2009年7月7日 4:32
    版主
  • UserControl rootVisualPage = Application.Current.RootVisual as UserControl;
    
    
    在你的控件里写上这句,然后操作rootVisualPage
    封装个控件,方法如上,写好Show跟Hide方法就可以了

    感谢你的回复和耐心,新手,折腾了半天没有弄出来,烦请在百忙中能够提供一个实际的样例,谢谢
    2009年7月7日 5:46
  • public void cmdSave_Click(object sender, RoutedEventArgs e)
    {
       gdMessage.SetValue(Canvas.ZIndexProperty, 1); 

       this.Dispatcher.BeginInvoke(delegate()
       {
       /// your actions....
       });
    }
    2009年7月7日 8:01
  • public void cmdSave_Click(object sender, RoutedEventArgs e)
    {
       gdMessage.SetValue(Canvas.ZIndexProperty, 1); 

       this.Dispatcher.BeginInvoke(delegate()
       {
       /// your actions....
       });
    }

    谢谢你的回复,我试了你这个,还是一样的,等到所有的数据到保存完了才出现提示框,开始不能出来
    2009年7月7日 8:34
  • 在MIX09的一个demo中有个控件 activitycontrol,可以实现你的需求,你可以留下邮箱,我发给你code.

    2009年7月7日 16:02
  • 不好意思.
    可以试试用BackGround Thread,类似这样:
    public void cmdSave_Click(object sender, RoutedEventArgs e)

       Thread thread = new Thread(new ThreadStart(delegate(){
                    this.Dispatcher.BeginInvoke(delegate(){
                              gdMessage.SetValue(Canvas.ZIndexProperty, 1); 
                              log.UpdateLayout();});
                    Thread.Sleep(50);
                    this.Dispatcher.BeginInvoke(delegate()
                    {
                      //// your actions
                    });
                }));
                thread.IsBackground = true;
                thread.Start();
      
      }
    2009年7月7日 16:59
  • 在MIX09的一个demo中有个控件 activitycontrol,可以实现你的需求,你可以留下邮箱,我发给你code.


    谢谢,我的邮箱为: blbb.liu@gmail.com
    2009年7月7日 23:28
  • 已经发送了,查收吧。
    2009年7月7日 23:31
  • BackgroundWorker,因为你用UI的线程去做数据操作,这个线程就阻塞了。用BackgroundWorker,把数据操作放到后台去做,放得时候显示消息,好了以后触发UI的回调把消息隐藏就可以了
    2009年7月8日 0:58
  • 不好意思.
    可以试试用BackGround Thread,类似这样:
    public void cmdSave_Click(object sender, RoutedEventArgs e)

       Thread thread = new Thread(new ThreadStart(delegate(){
                    this.Dispatcher.BeginInvoke(delegate(){
                              gdMessage.SetValue(Canvas.ZIndexProperty, 1); 
                              log.UpdateLayout();});
                    Thread.Sleep(50);
                    this.Dispatcher.BeginInvoke(delegate()
                    {
                      //// your actions
                    });
                }));
                thread.IsBackground = true;
                thread.Start();
      
      }

    这个行了,非常感谢, 也感谢jv9的耐性,感谢大家
    • 已标记为答案 Tsingbegin 2009年7月8日 6:34
    2009年7月8日 1:28