C# 加载映像时的MVVM WPF Fire命令(加载事件时)

C# 加载映像时的MVVM WPF Fire命令(加载事件时),c#,wpf,visual-studio-2008,icommand,C#,Wpf,Visual Studio 2008,Icommand,我的视图中有一个WPF图像控件。加载图像时,我希望触发在模型视图中定义和执行的事件。我该怎么做?我不知道如何使用命令执行此操作 <Image Grid.Row="0" Source="{Binding Path=ImageSrc, NotifyOnTargetUpdated=True, Converter={StaticResource imgToSrcConverter}}" Visibility="{Binding ImgVisibility}"

我的视图中有一个WPF图像控件。加载图像时,我希望触发在模型视图中定义和执行的事件。我该怎么做?我不知道如何使用命令执行此操作

<Image Grid.Row="0" 
       Source="{Binding Path=ImageSrc,  NotifyOnTargetUpdated=True, Converter={StaticResource imgToSrcConverter}}" 
       Visibility="{Binding ImgVisibility}" 
       RenderTransformOrigin="0,0"
       SnapsToDevicePixels="True"
       OverridesDefaultStyle="False"
       TargetUpdated="targetUpdated" 
       Cursor="Hand"
       RenderOptions.BitmapScalingMode="LowQuality"
       RenderOptions.EdgeMode="Aliased">
<Image.Effect>
        <DropShadowEffect Opacity="0.8" BlurRadius="8">                
        </DropShadowEffect>
    </Image.Effect>
</Image>
查看模型

public class ImgToSrcConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
            System.Globalization.CultureInfo culture)
    {
        Image image = value as Image;
        if (image != null)
        {
            MemoryStream ms = new MemoryStream();
            image.Save(ms, image.RawFormat);
            ms.Seek(0, SeekOrigin.Begin);
            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            bi.StreamSource = ms;
            bi.EndInit();
            return bi;
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType,
        object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
        public Image ImageSrc
        {
            get
            {
                MemoryStream ms = new MemoryStream(GetImageAsByteArray());
                Image img = Image.FromStream(ms);

                // Here I call method to hide splash screen "Loading"

                return img;
            }
        }

您可以在后台加载图像,并在加载图像后调用“NotifyPropertyChanged”:

private static Image SplashScreenImage = GetSplashScreenImage();
private Image ActualImage = null;
private bool IsLoading = false;
public Image ImageSrc
{
    get
    {
        if (ActualImage != null)
            return ActualImage;

        if (!IsLoading)
        {
            IsLoading = true;
            // start loading image in background
            Task.Run(() =>
            {
                MemoryStream ms = new MemoryStream(GetImageAsByteArray());
                ActualImage = Image.FromStream(ms);
            }).ContinueWith(t => PropertyChanged("ImageSrc"), TaskScheduler.FromCurrentSynchronizationContext());
        }
        return SplashScreenImage;
    }
}

您可以使用不带转换器的异步绑定:

<Image Source="{Binding ImageSrc, IsAsync=True}"/>

如果要在
图像
元素的
加载
事件触发时调用命令,可以使用交互触发器:

<Image Grid.Row="0" 
           Source="{Binding Path=ImageSrc,  NotifyOnTargetUpdated=True, Converter={StaticResource imgToSrcConverter}}" 
           Visibility="{Binding ImgVisibility}" 
           RenderTransformOrigin="0,0"
           SnapsToDevicePixels="True"
           OverridesDefaultStyle="False"
           TargetUpdated="targetUpdated" 
           Cursor="Hand"
           RenderOptions.BitmapScalingMode="LowQuality"
           RenderOptions.EdgeMode="Aliased"
           xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <i:InvokeCommandAction Command="{Binding YourCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Image.Effect>
        <DropShadowEffect Opacity="0.8" BlurRadius="8">
        </DropShadowEffect>
    </Image.Effect>
</Image>

是否将其源属性绑定到视图模型中的属性?然后,您可以在调用视图模型属性getter时执行一个操作。什么是“模型视图”?准确使用这些术语是值得的。@Clemens-设置属性和完成加载不是一回事。@Henkholtman,这取决于图像的实际加载方式,例如是否从web资源加载。@Clemens是的,我将源属性绑定到视图模型中的图像属性。我已经试过了。基本上,我试图做的是在图像完全加载时隐藏加载启动屏幕。但实际情况是,我在getter中调用了一个方法,并且在加载图像前几秒钟加载了启动屏幕。由于WPF图像控件,我在源代码中设置了一个转换器以获得较低的图像分辨率。我使用的是NET 3.5 SP1,没有可用的任务。这不是我想要的。我也不明白为什么您要将启动屏幕图像返回到图像源。我假装做的是:当我在做一个长任务时,我会显示一个启动屏幕,显示“加载…”。这项漫长的任务包括将图像从高分辨率转换为低分辨率。这就是GetImageAsByteArray的功能。然后,一旦我将图像转换为低分辨率,我就想关闭启动屏幕。我遇到的问题是,一旦调用OnPropertyChanged(“ImageSrc”),启动屏幕关闭后,图像会花费几秒钟时间让用户看到……。我想在加载iimage之后关闭启动屏幕,呈现并使用户可见。我不想在图像可见之前关闭启动屏幕。所以,wpf图像控件上是否有一个事件,或者在用户看到图像后,是否有某种方式来执行某些操作(在我的示例中,关闭启动屏幕)?
<Image Grid.Row="0" 
           Source="{Binding Path=ImageSrc,  NotifyOnTargetUpdated=True, Converter={StaticResource imgToSrcConverter}}" 
           Visibility="{Binding ImgVisibility}" 
           RenderTransformOrigin="0,0"
           SnapsToDevicePixels="True"
           OverridesDefaultStyle="False"
           TargetUpdated="targetUpdated" 
           Cursor="Hand"
           RenderOptions.BitmapScalingMode="LowQuality"
           RenderOptions.EdgeMode="Aliased"
           xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity">
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="Loaded">
            <i:InvokeCommandAction Command="{Binding YourCommand}" />
        </i:EventTrigger>
    </i:Interaction.Triggers>
    <Image.Effect>
        <DropShadowEffect Opacity="0.8" BlurRadius="8">
        </DropShadowEffect>
    </Image.Effect>
</Image>
public Image ImageSrc
{
    get
    {
        MemoryStream ms = new MemoryStream(GetImageAsByteArray());
        Image img = Image.FromStream(ms);

        YourCommandProperty.Execute(null);

        return img;
    }
}