如何知道窗口控件样式何时完成
本文关键字:何时完 样式 控件 何知道 窗口 | 更新日期: 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
}));
}