1

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

有铅吗??

4

1 回答 1

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);
    }

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

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

于 2013-02-18T13:57:10.533 回答