Как заставить C # WPF MVVM Screensaver использовать двойной монитор? - PullRequest
0 голосов
/ 16 февраля 2019

Я ищу ответ, как получить C # -WPF-MVVM-Screensaver-View на двух и более запущенных мониторах.Я прочитал несколько учебных пособий на веб-страницах и ответы здесь.Тем не менее, никогда образцы кода не работали на wpfУ кого-нибудь есть пример кода, который работает для wpf и Model View ViewModel Pattern?

Я ценю вашу помощь и спасибо.

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

вы можете сделать это упрощенно и умно.Я использую только метод внутри app.xaml.cs

/// <summary>
/// Shows the screensaver on every monitor. This is a multi monitor
/// application.
/// </summary>
private void ShowScreenSaver()
{
     ClockWindow ownerWindow = null;

     // Creates window on other screens.
     foreach (System.Windows.Forms.Screen screen in System.Windows.Forms.Screen.AllScreens)
     {
         ClockWindow window = new ClockWindow(screen.Bounds.Width,
                screen.Bounds.Height);

         // Primary screen does not have WindowsStartupLocation.
         if (screen.Primary)
         {

             // Maximizes screen.
             window.WindowState = WindowState.Maximized;

             ownerWindow = window;
         }
         else
         {

             // Other screens need a WindowStartupLocation on manual.
             window.WindowStartupLocation = WindowStartupLocation.Manual;

             System.Drawing.Rectangle location = screen.Bounds;
             window.Top = location.Top;
             window.Left = location.Left - 480;
             window.Width = location.Width;
             window.Height = location.Height;
         }

         window.Show();
     }

     // Sets every other screen owned to prmary window.
     // It closes all windows at once.
     foreach (Window window in Current.Windows)
     {
         if (window != ownerWindow)
         {
             window.Owner = ownerWindow;
         }
     }
 }

Здесь я добавил View, который я инициализирую для нескольких дисплеев.

<Window x:Class="Clock_ScreenSaver.Views.ClockWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:Clock_ScreenSaver.Views"
        mc:Ignorable="d"
        Title="ClockWindow"
        Height="{Binding DisplayHeight}"
        Width="{Binding DisplayWidth}"
        AllowsTransparency="True"
        Background="Black"
        Cursor="None"
        ShowInTaskbar="False"
        KeyDown="ClockWindow_KeyDown"
        MouseMove="ClockWindow_MouseMove"
        MouseDown="ClockWindow_MouseDown"
        Closing="ClockWindowClosing"
        Loaded="ClockWindowLoaded"
        WindowStyle="None"
        ResizeMode="NoResize">

    <Grid Name="WindowGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="300"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*" />
            <ColumnDefinition Width="300"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
    <Border Grid.Row="1" Grid.Column="1" CornerRadius="360" BorderBrush="#FFDF66" BorderThickness="5" Background="#2D2D30">
        <StackPanel>
            <Label Foreground="#FFDF66" Margin="0,15,0,0" FontSize="25" FontFamily="Arial" HorizontalAlignment="Center">DIGICLOCK</Label>

            <StackPanel Background="#3F3F46" Margin="0,20,0,5" Width="280" Height="100">
                <Label Content="{Binding ClockTime}"  Name="timelbl" Margin="0,20,0,0" Foreground="#FFDF66" FontSize="40" FontFamily="Arial" HorizontalAlignment="Center"></Label>
            </StackPanel>

            <StackPanel Background="#3F3F46" Margin="0,0,0,10"  Width="280" Height="50">
                <Label Content="{Binding ClockDate}"  Name="datelbl" Margin="0,8,0,0" Foreground="#FFDF66" FontSize="20" FontFamily="Arial" HorizontalAlignment="Center"></Label>
            </StackPanel>

            <Button Width="60" Padding="5,5,5,5" Background="#FFDF66" FontSize="10" FontFamily="Arial" Foreground="#333333" BorderThickness="0" Name="QuitBtn" Click="QuitBtn_Click">
                Quit
            </Button>
        </StackPanel>
    </Border>
    </Grid>
</Window>
0 голосов
/ 28 февраля 2019

Спасибо.Я сделал это в Windows 10.

  1. Создайте новый проект окна WPF для C #
  2. Удалите startupuri / startuplocation из app.xaml.
  3. Добавьте метод запуска вapp.xaml.

<Application x:Class="SeveralDisplays.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:SeveralDisplays"
             Startup="OnStartup">
    <Application.Resources>
         
    </Application.Resources>
</Application>
using System.Drawing;
using System.Windows;
using System.Windows.Forms;
using Application = System.Windows.Application;

namespace SeveralDisplays
{

    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        private void OnStartup(object sender, StartupEventArgs e)
        {
            Window mainWindow1 = new MainWindow();
            Window mainWindow2 = new MainWindow2();

            Screen s1 = Screen.AllScreens[0];
            Screen s2 = Screen.AllScreens[1];

            Rectangle r1 = s1.WorkingArea;
            Rectangle r2 = s2.WorkingArea;

            mainWindow1.Top = r1.Top;
            mainWindow1.Left = r1.Left;

            mainWindow2.Top = r2.Top;
            mainWindow2.Left = r2.Left;

            mainWindow1.Show();
            mainWindow2.Show();

            mainWindow2.Owner = mainWindow1;
        }
    }
} 
добавьте два класса и убедитесь, что они являются классами окон. Первый / Основной вид, не меняйте здесь слишком много

<Window x:Class="SeveralDisplays.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SeveralDisplays"
        mc:Ignorable="d"
        Loaded="MainWindow_OnLoaded"
        
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        
    </Grid>
</Window>

код первого окна позади

с использованием System.Windows;

пространство имен нескольких дисплеев {

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
    }

    private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
    {
        WindowState = WindowState.Maximized;
        WindowStyle = WindowStyle.None;
        ShowInTaskbar = false;
    }
}

}

Второй xaml как окно

<Window x:Class="SeveralDisplays.MainWindow2"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:SeveralDisplays"
        mc:Ignorable="d"
        Title="MainWindow2"
        WindowStartupLocation="Manual"
        WindowStyle="None"
        WindowState="Maximized"
        Height="300" Width="300">
    <Grid>
        
    </Grid>
</Window>

Код:

с использованием System.Windows;

пространство имен нескольких дисплеев {

public partial class MainWindow2 : Window
{
    public MainWindow2()
    {
        InitializeComponent();
    }
}

}

...