【问题标题】:Set Window Top, Left, Width & Height and only redraw once设置窗口顶部、左侧、宽度和高度,并且只重绘一次
【发布时间】:2012-10-03 16:30:54
【问题描述】:

我在渲染窗口时遇到了一些问题,我想知道是否有一种方法可以设置这些属性的全部或一部分,并且只重绘/渲染一次窗口。

我的问题是我正在渲染 2 个窗口并使它们“附加”,以便它们一致地移动和调整大小。这意味着当我调整/移动一个窗口的大小时,我最终只需要进行 4 次渲染调用。

例如,“Move_Click”方法附加到我窗口上的按钮上。单击时,最终会调用“OnRender”两次。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }
    protected override void OnRender(DrawingContext drawingContext)
    {
        Console.Error.WriteLine("On rendering...");
        base.OnRender(drawingContext);
    }

    private void Move_Click(object sender, RoutedEventArgs e)
    {
        this.Left--;
        this.Top--;
        this.Width--;
        this.Height--;
    }
}

【问题讨论】:

    标签: .net wpf c#-4.0


    【解决方案1】:

    您可以只存储一个指示是否渲染的标志:

    public partial class MainWindow : Window
    {
        private bool suspended;
    
        public MainWindow()
        {
            this.InitializeComponent();
        }
    
        protected override void OnRender(DrawingContext drawingContext)
        {
            if (suspended)
                return;
    
            base.OnRender(drawingContext);
        }
    
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            suspended = true;
    
            Left = 0;
            Top = 0;
            Width = 100;
            Height = 100;
    
            suspended = false;
    
            this.InvalidateVisual();
        }
    }
    

    您可以使用诸如 SuspendRender() 和 ResumeRender() 等公共方法来包装它。

    【讨论】:

    • 这样就行了。希望有像win32 SetWindowPos这样的东西,但我不得不这样做。谢谢!
    【解决方案2】:

    您可以使用 this.SetBounds(this.Left-1, this.Top-1, this.Width-1, this.Height-1) 只调用一次绘制逻辑。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多