Modalless窗口上的WPF DispatcherTimer

时间:2011-04-06 10:14:03

标签: c# wpf wpf-controls window dispatcher

我有一个wpf进度窗口,定义如下:

<Window x:Class="NeoinfoXmlEditor.WPF.Forms.ProgressDisplayForm"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="84" Width="505" x:Name="root" WindowStartupLocation="CenterScreen">
    <Grid>
        <ProgressBar Height="15" x:Name="MessageProgessBar" HorizontalAlignment="Stretch" VerticalAlignment="Top" Maximum="10000" Margin="10,2,10,2" >
            <ProgressBar.Triggers>
                <EventTrigger RoutedEvent="ProgressBar.Loaded">
                    <BeginStoryboard>
                        <Storyboard x:Name="sb">
                            <DoubleAnimation Storyboard.TargetName="MessageProgessBar"
                                 Storyboard.TargetProperty="Value"
                                 From="0" To="10000" Duration="0:0:45"/>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger>
            </ProgressBar.Triggers>
        </ProgressBar>
        <TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="5" Text="{Binding ElementName=root, Path=Message}" />
    </Grid>
</Window>

文件背后的代码如下:

public partial class ProgressDisplayForm : Window
    {
        public static readonly DependencyProperty MessageProperty =
            DependencyProperty.Register("Message", typeof (string), typeof (ProgressDisplayForm));

        public string Message
        {
            get { return (string) GetValue(MessageProperty); }
            set { SetValue(MessageProperty, value); }
        }

        public ProgressDisplayForm()
        {
            InitializeComponent();
        }

        public void DisplayWindow()
        {
            this.Show();
            this.BeginStoryboard(sb);
        }

    }

您可以看到我尝试以两种方式启动progressBar动画: - 在ProgressBar.Loaded上使用EventTrigger - 从后面的代码,明确

问题是 - 两者都不起作用。

注意 - 我需要打开此窗口并将动画作为模态窗口启动,因此 ShowDialog()不是na选项。此外,我尝试使用DispatcherTimer,但它在某种程度上不起作用,在使用System.Timers.Timer类时使用this.Dispatcher.Invoke()。

我正在从主应用程序窗口调用DisplayWindow()方法。

我错过了什么?

提前致谢

2 个答案:

答案 0 :(得分:0)

我无法重现你的问题,你的XAML动画工作得很好!尝试将你的XAML代码复制到一个没有代码隐藏的新项目。我试过了,工作得很好:D

Progressbar Animation

答案 1 :(得分:0)

我发现了问题所在 - 我调用了NewWindow.Show(),然后继续进行一些高CPU计算,假设如果不使用ShowDialog()调用新窗口将在单独的线程上。

我使用BackgroundWorker修复了它!

无论如何,感谢您的帮助!