2015-07-19 3 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 новый каталог и т. д. Возможно, .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

Работает, потому что представление не перекрашивается немедленно. После каждого изменения появляется уведомление, что нужно выполнить перерисовку, и это будет сделано, когда приложение войдет в состояние ожидания. Таким образом, вы поступаете правильно, ждете простоя и снимаете скриншот –

Смежные вопросы