2015-07-19 68 views
0

我有一個window.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 
} 

EDIT

窗口本身是透明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> 

EDIT 2

另一件事提的是,內TakeScreenshotAndSave也有System.IO操作 - 獲取目錄中的所有文件夾,cre ation新目錄等。也許.NET看到了這一點,並且它是異步運行的。

+0

只要您不要異步調用'ChangeWindowControlStyles',它將在下一行運行時完成。您不必「等待」返回的方法,只要該行完成並轉到下一個方法就立即完成。取決於如何調用SomeMethod,你可能需要調用Dispatcher。 –

+0

您是否試圖在沒有所有程序窗口或屏幕截圖的情況下拍攝屏幕截圖,而不僅僅是觸發它的窗口,但您還有其他窗口? –

+0

我想隱藏窗口中的一個畫布,也要將window.Background Opacity更改爲0.所以,我想隱藏特定的控件而不是所有的窗口。我將編輯我的文章,添加一些額外的信息。 @ SaintJob2.0 – Edgar

回答

0

看起來像我找到了解決方案。我不知道它爲什麼會起作用,需要進一步調查。我在代碼示例中提到的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 

    })); 
} 
+2

它可以工作,因爲視圖不會立即重新繪製。每次更改後都會有一個通知,重新繪製必須完成,並在應用程序進入空閒狀態時完成。所以你在做正確的事情,等待空閒並拍攝截圖 –