首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >WPF中的Application.DoEvents()在哪里?

WPF中的Application.DoEvents()在哪里?
EN

Stack Overflow用户
提问于 2010-12-22 01:18:53
回答 8查看 99K关注 0票数 92

我有以下示例代码,可以在每次按下按钮时进行缩放:

XAML:

代码语言:javascript
复制
<Window x:Class="WpfApplication12.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Canvas x:Name="myCanvas">

        <Canvas.LayoutTransform>
            <ScaleTransform x:Name="myScaleTransform" />
        </Canvas.LayoutTransform> 

        <Button Content="Button" 
                Name="myButton" 
                Canvas.Left="50" 
                Canvas.Top="50" 
                Click="myButton_Click" />
    </Canvas>
</Window>

*.cs

代码语言:javascript
复制
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void myButton_Click(object sender, RoutedEventArgs e)
    {
        Console.WriteLine("scale {0}, location: {1}", 
            myScaleTransform.ScaleX,
            myCanvas.PointToScreen(GetMyByttonLocation()));

        myScaleTransform.ScaleX =
            myScaleTransform.ScaleY =
            myScaleTransform.ScaleX + 1;
        
        Console.WriteLine("scale {0}, location: {1}",
            myScaleTransform.ScaleX,
            myCanvas.PointToScreen(GetMyByttonLocation()));
    }
    
    private Point GetMyByttonLocation()
    {
        return new Point(
            Canvas.GetLeft(myButton),
            Canvas.GetTop(myButton));
    }
}

输出为:

代码语言:javascript
复制
scale 1, location: 296;315
scale 2, location: 296;315

scale 2, location: 346;365
scale 3, location: 346;365

scale 3, location: 396;415
scale 4, location: 396;415

正如你所看到的,有一个问题,我原以为可以用Application.DoEvents();来解决,但是...它在.NET 4中不存在先验。

该怎么办呢?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-12-22 01:25:19

旧的Application.DoEvents()方法在WPF中已被弃用,取而代之的是使用DispatcherBackground Worker Thread来完成您所描述的处理。

如果一定要使用Application.DoEvents(),那么只需将system.windows.forms.dll导入应用程序并调用该方法即可。但是,我们并不推荐这样做,因为您正在失去WPF提供的所有优势。

票数 26
EN

Stack Overflow用户

发布于 2010-12-22 01:37:02

试试这样的东西

代码语言:javascript
复制
public static void DoEvents()
{
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,
                                          new Action(delegate { }));
}
票数 136
EN

Stack Overflow用户

发布于 2012-08-10 18:04:40

好吧,我刚刚遇到了一个例子,我开始处理一个在Dispatcher线程上运行的方法,它需要在不阻塞UI线程的情况下阻塞。事实证明,msdn解释了如何基于Dispatcher本身实现DoEvents():

代码语言:javascript
复制
public void DoEvents()
{
    DispatcherFrame frame = new DispatcherFrame();
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
        new DispatcherOperationCallback(ExitFrame), frame);
    Dispatcher.PushFrame(frame);
}

public object ExitFrame(object f)
{
    ((DispatcherFrame)f).Continue = false;

    return null;
}

(摘自Dispatcher.PushFrame Method)

有些人可能更喜欢用一种方法来执行相同的逻辑:

代码语言:javascript
复制
public static void DoEvents()
{
    var frame = new DispatcherFrame();
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background,
        new DispatcherOperationCallback(
            delegate (object f)
            {
                ((DispatcherFrame)f).Continue = false;
                return null;
            }),frame);
    Dispatcher.PushFrame(frame);
}
票数 61
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4502037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档