WPF заставка Windows - PullRequest
       28

WPF заставка Windows

5 голосов
/ 07 июня 2011

Мне нужно иметь PNG (с прозрачностью) в качестве заставки. Прозрачные части изображения должны быть четкими, чтобы пользователь мог видеть любые окна позади него (или рабочего стола).

Мне также нужно отображать заставку в течение 5 секунд (в контракте конкретно указано 5 секунд), и она не может быть короче. Мне известно о свойстве build в VS 2010, но заставка появляется и уходит слишком быстро (менее 5 секунд).

Что я могу сделать, чтобы оно осталось 5 секунд (приблизительно)

Ответы [ 5 ]

5 голосов
/ 07 июня 2011

Если бы мне пришлось это сделать, я бы добавил окно и установил его свойства. AllowsTransparency = true; установил бы его запуск до того, как все формы, которые я имею в виду, перед загрузкой это можно сделать, изменив App.xml и установив Startup="Application_Startup Чтобы отключить верхний элемент управления по умолчанию, вы должны установить WindowStyle = none и там в своем коде

private void Application_Startup(object sender, StartupEventArgs e)
        {
            MainWindow mn = new MainWindow();
            mn.ShowDialog();          
        }

используйте таймер, чтобы делать то, что вы хотите

private DispatcherTimer timer;
timer = new DispatcherTimer();
            timer.Tick += new EventHandler(timer_Tick);
            timer.Interval = TimeSpan.FromMilliseconds(5000);
            timer.IsEnabled = true;

void timer_Tick(object sender, EventArgs e)
        {
///Close your window here
}

надеюсь, это поможет

5 голосов
/ 07 июня 2011

У меня была похожая проблема, когда я не мог использовать встроенную опцию заставки в проекте WPF.

Этот проект теперь с открытым исходным кодом, вы можете посмотреть здесь: https://code.google.com/p/theomniscientchimp/

Это автообновление (думаю, есть несколько вещей, которые вам не нужны).

Это минимум, который вам нужен:

Сторона WPF:

<Window x:Class="TheOmniscientChimp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:CustomXaml"
        Icon="SC2_Replay_Monkey.ico"
        Title="MainWindow" Height="256" Width="456" Background="#00005555" AllowsTransparency="True" WindowStyle="None" WindowStartupLocation="CenterScreen" >
        <Grid Width="Auto">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />           
        </Grid.RowDefinitions>
        <Image Name="splashScreenImage" Stretch="Fill" Grid.Row="0" />
    </Grid>
</Window>

C # сторона (код сзади):

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

            BitmapImage splashScreenImageSource = new BitmapImage();
            splashScreenImageSource.BeginInit();
            splashScreenImageSource.UriSource = new Uri("Your_Image.png", UriKind.Relative);
            splashScreenImageSource.EndInit();

            splashScreenImage.Source = splashScreenImageSource;
        }

        public void AsynchronousExit()
        {
            BackgroundWorker worker = new BackgroundWorker();
            worker.DoWork += new DoWorkEventHandler(worker_DoWork);
            worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
            worker.RunWorkerAsync();
        }

        private void worker_DoWork(object sender, DoWorkEventArgs e)
        {
            //Makes the thread wait for 5s before exiting.
            Thread.Sleep(5000);
        }

        private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Environment.Exit(0);
        }
    }

Скажите, если вам нужна помощь в настройке.

FB.

1 голос
/ 19 сентября 2011

У меня была та же проблема, но на самом деле это удивительно легко решить без чего-либо особенного:

  1. добавьте ваше изображение в основной проект и установите для свойства сборки значение Splash Screen.

  2. добавьте Thread.Sleep (5000) в конструктор главного окна вашего приложения прямо перед вызовом InitializeComponents ().

Это задержит загрузку вашего основного окна wpf, и заставка будет работать как минимум в течение времени загрузки + время сна, прежде чем появится главное окно и всплеск исчезнет.

0 голосов
/ 18 апреля 2013

Если вы используете окно с заставкой и работаете в фоновом режиме, вы делаете основной код более сложным, так как в этом нет необходимости.Решение состоит в том, чтобы написать основной код в виде обычного стиля синхронного кода в основном потоке пользовательского интерфейса, отображая всплывающее окно, пока вы его не закроете, и вы можете отправить обновление, чтобы изменить текст загрузки заставки или индикатор выполнения.

SplashWindow window = null;


var thread = new Thread(new ThreadStart(() =>
{
    Debug.Print("Thread begin");
    window = new SplashWindow();
    window.ShowDialog();
}));

thread.Name = "RunSplashWindow";
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();

Debug.Print("App begin");

Thread.Sleep(1000);

if (window != null)
{
    window.Dispatcher.BeginInvoke(new Del(() => {
        window.SetHeader("Running...");
    }), new object[0]);
}

Thread.Sleep(1000);

for (int i = 1; i <= 100; i++)
{
    if (window != null)
        {
             window.Dispatcher.BeginInvoke(new Del(() =>
             {
             window.SetProgress((double)i);
        }), new object[0]);
    }

    Thread.Sleep(10);
}

Thread.Sleep(1000);

Debug.Print("App end");

if (window != null)
{
    window.Dispatcher.BeginInvoke(new Del(() =>
    {
        window.Close();
    }), new object[0]);
}
0 голосов
/ 07 июня 2011

Возможно, вам придется сделать что-то похожее на то, что вы делаете в WinForms.Раскрутите новый поток и запустите Wpf-приложение в этом потоке.В WinForms это можно сделать с помощью System.Windows.Forms.Application.Run (new SplashForm ());Должно быть что-то похожее на это в Wpf.

РЕДАКТИРОВАТЬ: Я нашел это, так что должно работать.http://msdn.microsoft.com/en-us/library/ms597011.aspx

Ключ заключается в том, чтобы сделать это на отдельной резьбе.Поток, который запускает приложение, уже связан с одним приложением WPF, и вы хотите, чтобы ваш всплеск в основном представлял собой собственный графический интерфейс.Затем форма может иметь таймер, который заставляет ее закрыться, что должно автоматически завершить это другое приложение.

...