Я уверен, что пропускаю что-то простое, но WPF - это не то, над чем я обычно работаю, поэтому я немного почесываю голову от этого.
Я пытаюсь показать "всплеск"экран "для приложения, которое предназначено для запуска в фоновом режиме.Это в основном оболочка процесса для операционных систем Windows.
У меня есть WPF Window
, определенный следующим образом:
public partial class MainWindow : Window
{
private Timer _timer;
public MainWindow()
{
InitializeComponent();
ContentRendered += MainWindow_ContentRendered;
}
private void MainWindow_ContentRendered(object sender, EventArgs e)
{
_timer = new Timer(5000);
_timer.Elapsed += TimerOnElapsed;
_timer.Enabled = true;
_timer.Start();
}
private void TimerOnElapsed(object sender, ElapsedEventArgs e)
{
Dispatcher.Invoke(() =>
{
Hide();
Close();
});
}
~MainWindow()
{
_timer.Dispose();
}
}
public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector {
private bool _contentLoaded;
/// <summary>
/// InitializeComponent
/// </summary>
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
public void InitializeComponent() {
if (_contentLoaded) {
return;
}
_contentLoaded = true;
System.Uri resourceLocater = new System.Uri("/MySolution.WindowsWrapper;component/mainwindow.xaml", System.UriKind.Relative);
#line 1 "..\..\MainWindow.xaml"
System.Windows.Application.LoadComponent(this, resourceLocater);
#line default
#line hidden
}
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")]
void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) {
this._contentLoaded = true;
}
}
XAML выглядит так:
<Window x:Class="MySolution.WindowsWrapper.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:MySolution.WindowsWrapper"
mc:Ignorable="d"
Title="Splash" Height="100" Width="327" WindowStyle="None"
HorizontalAlignment="Center" VerticalAlignment="Center"
AllowsTransparency="True" WindowStartupLocation="CenterScreen" ShowInTaskbar="False" Topmost="True">
<Window.Background>
<ImageBrush ImageSource="my-logo-large.png"/>
</Window.Background>
<Grid VerticalAlignment="Center" HorizontalAlignment="Center">
</Grid>
</Window>
.... в моем файле Program.cs у меня есть что-то вроде этого:
[STAThread]
public static void Main(string[] args)
{
var splashScreen = new MainWindow();
splashScreen.Show();
SetupSystemTrayIcon();
var showConsole = args.Any(x => x.ToLowerInvariant().Contains("showconsole"));
StartService(showConsole);
WaitToDie();
}
Заставка отображается, как и ожидалось ... но таймер никогда не инициализируется и никогда не срабатывает, поэтому он никогда не исчезает.
Из того, что я прочитал, событие ContentRendered
должно вызываться, когда отображается окно ... но, похоже, этого не происходит.Что я делаю неправильно?