Я хочу, чтобы показать предварительный просмотр экранной заставки внутри окна WPF. (используя контейнер или элемент управления или ...) Я знаю, что сама Windows передает аргумент «/ p» на экранную заставку, чтобы получить предварительный просмотр. Но как я могу показать этот предварительный просмотр внутри своего приложения WPF? Должен ли я получить его ручку и изменить ее родительский элемент на мой контейнер? Как?Как показать предварительный просмотр экранной заставки внутри окна WPF
3
A
ответ
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
Ссылки
- Walkthrough: Hosting a Windows Forms Control in WPF
- Creating a Screen Saver with C# (описывает аргументы командной строки)
Спасибо большое. Работает отлично. – SepehrM
Обновленный код, теперь меньше кода. 'Windows.Forms.Control' создан в XAML. Это первый раз, когда я использовал Windows Forms interop; похоже, что инструкция на MSDN немного усложняет ситуацию. – Athari
saver.Kill(); необходимо! В моем тесте он не закрывал себя. – SepehrM