2013-02-18 59 views
1

我有一个WPF应用程序。我正在使用自动隐藏窗格来托管非常复杂的用户控件。 当用户单击窗格时,大约需要10秒。加载控件,我试图创建一个“加载...”窗口通知用户该应用程序正在工作。 在这个等待窗口中,我有一个动画来旋转图像。 我的问题是2天后我仍然无法旋转轮子,因为我使用的是与加载usercontrol相同的线程。我的“加载”窗口工作得很好,如果我没有窗格更新运行它。 我尝试了几件事 - BackgroundWorker,Dispatcher.Invoke。我在网络中找到的所有示例都是关于在保持UI活动的同时执行后台任务。在UI中更新2个元素

任何铅?

+0

您正在后台线程中加载用户控件,而不是旋转的轮子 - 对吗? – 2013-02-18 12:20:38

回答

1

虽然我没有明确得到这个问题,但我想给这个答案是更好,因为我能得到这个问题。:-)

我的方案,我已经创建了一个主窗口,加载时间消耗按钮点击的控制。加载耗时的控件时,我一直保持10秒的睡眠时间。

主窗口代码:

XAML中 -

<Window x:Class="Wpf.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Wpf" 
    Title="MainWindow" Height="350" Width="525" 
    x:Name="root"> 
<Window.Resources> 
    <DataTemplate x:Key="loadingTemplate" DataType="ContentControl"> 
     <StackPanel> 
      <TextBlock Text="Loading..." Margin="5"/> 
     </StackPanel> 
    </DataTemplate> 

</Window.Resources> 

<StackPanel x:Name="stpRootLayout"> 
    <Button Content="Click to load pane" Click="Button_Click"/> 
    <Border BorderThickness="5" BorderBrush="Black" Height="100"> 
    <ContentControl x:Name="cctPlaceHolder"> 

    </ContentControl> 
    </Border> 
</StackPanel> 

Xaml.cs -

public delegate void LoadTimeConsumingControlDelegate(); 

public void LoadTimeConsumingControl() 
    { 
     //set our progress dialog text and value 
     cctPlaceHolder.Content = new TimeConsumingControl(); 
    } 

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     BackgroundWorker worker = new BackgroundWorker(); 
     cctPlaceHolder.ContentTemplate = this.TryFindResource("loadingTemplate") as DataTemplate; 
     System.Windows.Threading.Dispatcher cctDispatcher = cctPlaceHolder.Dispatcher; 
     worker.DoWork += delegate(object s, DoWorkEventArgs args) 
     { 
      LoadTimeConsumingControlDelegate update = new LoadTimeConsumingControlDelegate(LoadTimeConsumingControl); 
      cctDispatcher.BeginInvoke(update); 
     }; 

     worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args) 
     { 
      cctPlaceHolder.ContentTemplate = null; 
     }; 

     worker.RunWorkerAsync(); 
    } 

费时控制:

的XAML -

<UserControl x:Class="Wpf.TimeConsumingControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid> 
    <TextBlock Text="some text..................................................................................................."/> 
</Grid> 

Xaml.cs

public TimeConsumingControl() 
    { 
     InitializeComponent(); 
     Thread.Sleep(10000); 
    } 

替换为您加载主题数据模板。

希望这是你正在寻找的东西。如果没有,你可以回到我身边。

+0

非常感谢您的时间和精力。对此,我真的非常感激。在我的动画没有移动之前,我尝试了它。幸运的是我在帖子中找到了解决方案。 – Kulpemovitz 2013-02-18 17:21:15