如何判断WPF窗口中何时发生可见更改

本文关键字:何时发 窗口 何判断 判断 WPF | 更新日期: 2023-09-27 18:00:00

我正在捕获包含任意内容(控件等)的WPF窗口的可视化表示。每次窗口发生视觉变化时,我都需要捕捉窗口的图片。

当窗口在视觉上发生变化时(大小变化、内容变化……用户用眼睛能看到的任何东西),我该怎么办?我不在乎其他的变化。

我发现了一些与知道渲染何时完成有关的问题,但我不确定这是完全相同的事情,因为我更关心的是窗口作为一个区域,并且如果视觉没有改变,我不担心渲染会发生。

如何判断WPF窗口中何时发生可见更改

您可以使用Window.LayoutUpdated事件,它应该能满足您的需要
考虑以下内容:

<Window x:Class="WpfApplication11.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"
        LayoutUpdated="MainWindow_OnLayoutUpdated">
    <StackPanel>
        <Label>Last event:</Label>
        <TextBox x:Name="LastEvent"/>
        <Label x:Name="Updateable">Updateable</Label>
        <UniformGrid x:Name="Controls"/>
    </StackPanel>
</Window>

以及背后的代码:

public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
        button_Click(null, null);
        var timer = new Timer(1000);
        timer.Elapsed += timer_Elapsed;
        timer.Start();
    }
    private void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        Dispatcher.Invoke(new Action(() =>
            {
                var rand = new Random();
                Updateable.Background =
                    new SolidColorBrush(Color.FromRgb((byte) rand.Next(byte.MaxValue),
                                                      (byte) rand.Next(byte.MaxValue),
                                                      (byte) rand.Next(byte.MaxValue)));
            }));
    }
    private void button_Click(object sender, RoutedEventArgs e)
    {
        var button = new Button {Content = "Click Me!"};
        button.Click += button_Click;
        Controls.Children.Add(button);
    }
    private void MainWindow_OnLayoutUpdated(object sender, EventArgs eventArgs)
    {
        LastEvent.Text = DateTime.Now.ToLongTimeString();
    }
}