2013-08-31 2 views
3

Я хочу, чтобы показать предварительный просмотр экранной заставки внутри окна WPF. (используя контейнер или элемент управления или ...) Я знаю, что сама Windows передает аргумент «/ p» на экранную заставку, чтобы получить предварительный просмотр. Но как я могу показать этот предварительный просмотр внутри своего приложения WPF? Должен ли я получить его ручку и изменить ее родительский элемент на мой контейнер? Как?Как показать предварительный просмотр экранной заставки внутри окна WPF

ответ

2

Вам необходимо использовать Windows.Forms interop, потому что хранители экрана ожидают, что Windows обрабатывает (HWND) и в WPF, только окна верхнего уровня имеют их.

MainWindow.xaml

<Window x:Class="So18547663WpfScreenSaverPreview.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:forms="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms" 
     Title="Screen Saver Preview" Height="350" Width="525" 
     Loaded="MainWindow_OnLoaded" Closed="MainWindow_OnClosed" 
     SizeToContent="WidthAndHeight"> 
    <StackPanel Orientation="Vertical" Margin="8"> 
     <TextBlock Text="Preview"/> 
     <WindowsFormsHost x:Name="host" Width="320" Height="240"> 
      <forms:Control Width="320" Height="240"/> 
     </WindowsFormsHost> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs

using System; 
using System.Diagnostics; 
using System.Windows; 

namespace So18547663WpfScreenSaverPreview 
{ 
    public partial class MainWindow 
    { 
     private Process saver; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void MainWindow_OnLoaded (object sender, RoutedEventArgs e) 
     { 
      saver = Process.Start(new ProcessStartInfo { 
       FileName = "Bubbles.scr", 
       Arguments = "/p " + host.Child.Handle, 
       UseShellExecute = false, 
      }); 
     } 

     private void MainWindow_OnClosed (object sender, EventArgs e) 
     { 
      // Optional. Screen savers should close themselves 
      // when the parent window is destroyed. 
      saver.Kill(); 
     } 
    } 
} 

Ассамблея ссылается

  • WindowsFormsIntegration
  • System.Windows.Forms

Ссылки

+0

Спасибо большое. Работает отлично. – SepehrM

+0

Обновленный код, теперь меньше кода. 'Windows.Forms.Control' создан в XAML. Это первый раз, когда я использовал Windows Forms interop; похоже, что инструкция на MSDN немного усложняет ситуацию. – Athari

+0

saver.Kill(); необходимо! В моем тесте он не закрывал себя. – SepehrM