代码之家  ›  专栏  ›  技术社区  ›  pearcewg

Silverlight:强制画布失效或重新绘制自身?

  •  6
  • pearcewg  · 技术社区  · 15 年前

    我有一个Silverlight应用程序,上面有一个画布。 在画布上,我动态地“绘制”了一堆东西,但在画布上添加了控件。

    我在画布区域外有一个按钮,用于清除内容。 对象已删除(成功)。但是,画布区域不会立即刷新自身;当前画布本身需要鼠标悬停或其他事件。

    让外部对象使画布无效的最简单方法是什么?我肯定我错过了一些简单的东西!

    4 回复  |  直到 15 年前
        1
  •  4
  •   George Sealy    15 年前

    这有点脏,但您可以尝试将画布的可见性更改为“可见”(即使已经可见),因此:

    myCanvas.Visibility = Visibility.Visible;
    

    我们发现,即使myCanvas.Visible的实际值没有改变,也会强制重新绘制。。。

    试一试,这只是一条可以解决问题的单行线。尽管我希望画布会被重新绘制,如果你从画布上移除东西的话。

        2
  •  1
  •   dFlat    13 年前

    yourFrameworkElement.InvalidateArrange();
    yourFrameworkElement.UpdateLayout();
    

    为我工作。

    this.yourFrameworkElement.UpdateLayout(); InvalidateArrange() UpdateLayout() 之后立即完成-可能没有任何实际影响。

    还有 myCanvas.Visibility = Visibility.Visible; 这个技巧对我不起作用,因为我正试图引发LayoutUpdate事件。

        3
  •  1
  •   Jordan    13 年前

    using System;
    using System.Windows.Threading;
    
    public static class MyTestClass
    {
        public static void Postpone(Action a_action)
        {
            TaggedDispatchTimer timer = new TaggedDispatchTimer();
            timer.Interval = TimeSpan.FromSeconds(0.1);
            timer.Tick += OnDoPostponedAction;
            timer.UserState = a_action;
            timer.Start();
        }
    
        private static void OnDoPostponedAction(object sender, EventArgs e)
        {
            TaggedDispatchTimer timer = sender as TaggedDispatchTimer;
            timer.Stop();
            timer.Tick -= OnDoPostponedAction;
    
            var action = timer.UserState as Action;
            if (action != null)
                action();
        }
    }
    
    public class TaggedDispatchTimer : DispatcherTimer
    {
        public Object UserState { get; set; }
    
    }
    

    以下是我如何使用它:

    MyTestClass.Postpone(() =>
        {
            // Do some bloody long operation.
        });
    
        4
  •  0
  •   Samo    10 年前

    myCanvas.Visibility = Visibility.Visible;

    myCanvas.Visibility = Visibility.Collapsed;
    myCanvas.Visibility = Visibility.Visible;
    

    工作很好。

    这个 InvalidateArrange UpdateLayout 我也没有这么做。

    最后,所有这些都不是必需的,因为我意识到画布中的画布不是必需的,并且能够为StackPanel更改内部画布,并且不需要任何技巧就可以按预期工作。

    推荐文章