如何知道窗口控件样式何时完成

本文关键字:何时完 样式 控件 何知道 窗口 | 更新日期: 2023-09-27 18:03:41

我有一个窗口。Xaml具有不同样式的组件(边框颜色为红色,不透明度改变等等)。在一个时刻,我想创建一个屏幕截图并保存到文件夹。但在此之前,窗口背景应该是透明的,someCanvas应该隐藏。

我怎么知道样式方法什么时候完成,这样我就可以截图了?

public void SomeMethod()
{
    ChangeWindowControlStyles();
    //TODO: waint till 'ChangeWindowControlStyles' finished
    TageScreenshotAndSave();
}
public void ChangeWindowControlStyles()
{
     this.Background.Opacity = 0;
     this.someCanvas.Visibility = Visibility.Collapsed;
     //Some other stuff related to window content styling
}
public void TakeScreenshotAndSave()
{
    //No multithreading happening here
    //Just taking screenshot and saving to folder
}

编辑

窗口本身是透明的WindowStyle="None",这意味着它没有边界。在开始时,窗口的Background.Opacity被设置为0.1,所有控件都是可见的(除了someCanvas,还有其他控件应该总是可见的)。

截图前someCanvas被隐藏,Background.Opacity被设置为0

Window.xaml

<Window
    WindowStartupLocation="CenterScreen" 
    ResizeMode="NoResize" 
    WindowState="Maximized"
    WindowStyle="None" 
    AllowsTransparency="True" >
   <Window.Background>
        <SolidColorBrush Opacity="0.1" Color="White"/>
    </Window.Background>
        <Grid Name="mainGrid" Background="Transparent" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Margin="0">
            <!--Main canvas, function holder-->
            <Canvas Name="canvasAlwaysVisible" Margin="0" Panel.ZIndex="5">
                <!-- Controls that are always visible -->
            </Canvas>
            <Canvas x:Name="someCanvas" Margin="0" Background="Transparent" Visibility="Visibility">
                <!-- Controls with styling -->
            </Canvas>
        </Grid>
</Window>

编辑2

另一件要提到的事情是,在TakeScreenshotAndSave中也有System.IO操作,例如-在目录中获取所有文件夹,创建新目录等等。也许。net看到了,它是异步运行的

如何知道窗口控件样式何时完成

看来我找到解决方案了。我不知道为什么它会起作用,需要进一步调查。我在代码示例中提到的TakeScreenshotAndSave方法不知何故运行在不同的线程上。当在Application.Current.Dispatcher中包装该方法时,它工作了!

public void SomeMethod()
{
    ChangeWindowControlStyles();
    var m_dispatcher = Application.Current.Dispatcher;
    m_dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.ApplicationIdle,
    new System.Threading.ThreadStart(delegate
    {
        TakeScreenshotAndSave(); //Now running on UI thread
    }));
}