繁体   English   中英

图像控件未呈现

[英]Image control doesn't get rendered

我正在尝试使用多个小型编辑器创建WPF应用程序。 这些编辑器之一需要加载两个图像,在TextBox中输入名称,然后单击保存按钮。

在代码中,这确实可以完美地工作。 文件将保存在模型中,并且可以加载图像。 在点击保存按钮之前,两个图像实际上都显示在编辑器中。 但是,重新打开(用于编辑)后,仅渲染一张图像。

我进行了一些测试,发现总是没有渲染第一张图像,而第二张却总是。

例如,在XAML中,它看起来像这样:

<Image Name="BackgroundImage" Grid.Row="1" Grid.Column="0" Source="{Binding Path=Background}" Width="120" Height="90"/>
<Image Name="ForegroundImage" Grid.Row="2" Grid.Column="0" Source="{Binding Path=Foreground}" Width="120" Height="90"/>

这里的BackgroundImage没有得到呈现,即使该模型的属性Background已成功加载图像。 如果我要交换这些XAML标记,这意味着将ForegroundImage控件放在BackgroundImage之上,那么ForegroundImage不会被渲染,而BackgroundImage却会被渲染。 即使我不更改其他任何东西,例如Grid.Row或Column。

然后,我尝试在窗口的Loaded事件处理程序中的代码后面加载图像:

private void LocationEditor_OnLoaded(object sender, RoutedEventArgs e)
{
    BackgroundImage.Source = ((Location)DataContext).Background;
    ForegroundImage.Source = ((Location)DataContext).Foreground;
}

同样适用于这种情况。 无论哪一行先执行,都不会在Window中呈现。

如果有帮助,下面是Background属性的代码( Foreground的构建方式相同):

[JsonIgnore]
public BitmapImage Background
{
    get
    {
        if (!string.IsNullOrWhiteSpace(BackgroundFile))
        {
            SetFree();
            SetImage();
        }
        else
            _background = null;
        return _background;
    }
}

如果不再需要该映像,则SetFree()方法将释放内存资源。 当窗口关闭或需要BitmapImage时,就会发生这种情况。 (如果图像文件已更改,它将在每次重新加载图像。)

SetImage()方法仅做一件简单的事情:加载BackgroundFile图像文件的图像并将其保存在_background字段中。


我不太清楚问题可能是什么。 我已经尝试了一些方法,但是在编码时我并不经常使用图像。

您的SetFree()SetImage()方法一定存在问题。

幸运的是,由于WPF提供了从stringUribyte[]ImageSource内置自动类型转换,因此您的视图模型中根本不需要BackgroundForeground属性。 因此,您可以将Image的Source属性直接绑定到视图模型中的相应路径属性:

<Image ... Source="{Binding BackgroundFile}"/>
<Image ... Source="{Binding ForegroundFile}"/>

为了完整起见,如果您仍然想要拥有这些属性,我建议使用如下所示的简单实现。 内置图像缓存将注意不要对文件进行过多的解码:

public ImageSource Background
{
    get
    {
        if (BackgroundFile != null)
        {
            try
            {
                return new BitmapImage(new Uri(BackgroundFile));
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message);
            }
        }

        return null;
    }
}

绑定问题可能很难解决。 有时,评估绑定的时机不明显或似乎没有道理。 我知道这是一个通用答案,但是我使用的一个技巧是为我遇到麻烦的绑定添加一个“调试转换器”,以便可以在评估期间进行调试。 它救了我几次。

<UserControl
 xmlns:converters="clr-namespace:WhateverYourNamespaceIs.Converters">
<UserControl.Resources>
<converters:DebugConverter x:Key="DebugConverter"/>
</UserControl.Resources>

<Image Name="BackgroundImage" Grid.Row="1" Grid.Column="0" Source="{Binding Path=Background, Converter={StaticResource DebugConverter}" Width="120" Height="90"/>




Here is an example of the converter.

public sealed class DebugConverter : IValueConverter
    { 


        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            //Debug.WriteLine("Debug Converter Value:" + value.ToString());
            // Since you are working with graphics, maybe just dump the size
Debug.WriteLine("Debug Converter Value:" + value.Length().ToString());
            return (value);
        }


        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM