Событие WPF ContentRendered не запускается? - PullRequest
0 голосов
/ 01 июня 2018

Я уверен, что пропускаю что-то простое, но 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 должно вызываться, когда отображается окно ... но, похоже, этого не происходит.Что я делаю неправильно?

1 Ответ

0 голосов
/ 01 июня 2018

Я предлагаю удалить пользовательский метод Main и переместить код в метод OnStartup класса App.xaml.cs:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        SetupSystemTrayIcon();

        var showConsole = args.Any(x => x.ToLowerInvariant().Contains("showconsole"));
        StartService(showConsole);
    }
}

Убедитесь, что для свойства StartupUri установлено значение MainWindow.xamlв вашем App.xaml:

<Application x:Class="WpfApp2.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp2"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
    </Application.Resources>
</Application>

Тогда вы должны получить диспетчер и окно, которое активируется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...