为什么TriggerEvent“已加载”绑定命令不适用于App.xaml

时间:2018-11-30 10:18:22

标签: c# wpf xaml mvvm

我正在尝试在加载应用程序时加载启动画面。 LoadSplashScreen是一个委托命令,用于检查是否已经有另一个程序正在运行,如果没有,则显示初始屏幕。

但是要检查属性,我需要在加载App.xaml时触发一个命令。

它向我显示“触发器不能附加到Application类型的元素” 我认为其他错误也与第一个错误有关,在第一个错误中,触发器绑定只能是“ DependencyObject”的派生类型。

这是xaml代码:

<Application x:Class="FST.CWI.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:viewModel="clr-namespace:FST.CWI.Sources.ViewModel"
             xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
             StartupUri="MainWindow.xaml"
             xmlns:interactivity="http://schemas.microsoft.com/expression/2010/interactivity">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Loaded">
                <i:InvokeCommandAction Command="{Binding LoadSplashScreen}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
        <Application.Resources>
        <viewModel:BaseViewModel x:Key="BaseVM" />
        <viewModel:AppViewModel x:Key="AppVM" />
        <viewModel:GeneralViewModel x:Key="GeneralVM" />
        <viewModel:SteeringViewModel x:Key="SteeringVM" />
        <viewModel:AdvancedViewModel x:Key="AdvancedVM" />
        <viewModel:SittingViewModel x:Key="SittingVM" />
    </Application.Resources>
</Application>

2 个答案:

答案 0 :(得分:0)

Wpf具有垃圾屏幕功能,也许您可​​以使用它:

https://docs.microsoft.com/en-us/dotnet/framework/wpf/app-development/how-to-add-a-splash-screen-to-a-wpf-application

它可以显示图像,直到出现MainWIndow。

答案 1 :(得分:0)

应用程序不是依赖对象,所以不要尝试使用依赖于它的任何东西。因为那根本行不通。

从打开主窗口的app.xaml中删除启动URL。 而是将其指向app.xaml.cs中的onstartup的替代项

<Application …
           Startup="OnStartup">

当然还有您在app.xaml.cs中的代码

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);
    //  Your logic here


}

在此处输入和重新显示您的逻辑,显示任何窗口或您喜欢的任何内容。

看起来会很像:

SplashScreen ss = null;
if ( your criteria goes here)
{
    ss = new SplashScreen("whatever.bmp");
    ss.Show();
}
MainWindow mw = new MainWindow();

if ( your criteria goes here )
{
    ss.Close();
}

mw.Show();