APPCRASH включен wpfgfx_v0400.dll только на 32-разрядных системах

#wpf #crash #32bit-64bit

#wpf #сбой #32-битный-64-битный

Вопрос:

У меня проблема с приложением WPF, которое я пишу. У меня есть окно, которое я загружаю с изображениями профиля, чтобы пользователь мог выбирать при настройке учетной записи в приложении. Каждое изображение загружается в пользовательский элемент управления и помещается в stackpanel, так что, когда пользователь нажимает на изображение, он запускает код в пользовательском элементе управления и автоматически устанавливает изображение своего профиля без необходимости дополнительных нажатий. Это окно отлично загружается в 64-разрядных системах. Однако при загрузке в 32-разрядной системе происходит сбой всего приложения. Модуль обнаружения ошибок wpfgfx_v0400.dll . Я не знаю, почему это сбой. Пожалуйста, помогите.

Вот ошибка в средстве просмотра событий: введите описание изображения здесь

Вот XAML на интерфейсе рассматриваемого окна:

 <Window x:Class="RandomApplication.Windows.ChooseProfilePic"
    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:RandomApplication.Windows"
    mc:Ignorable="d"
    WindowStartupLocation="CenterScreen"
    ContentRendered ="On_ContentRendered"
    Title="Choose A Picture" Height="515" Width="500" Background="Black" ResizeMode="CanMinimize">
<Grid Background="Black">
    <ScrollViewer VerticalScrollBarVisibility="Disabled" HorizontalScrollBarVisibility="Auto" Height="420" VerticalAlignment="Top" Margin="0,5,0,0">
        <StackPanel>
            <StackPanel Name="HeadsPanel" Orientation="Horizontal" Height="100" VerticalAlignment="Top"/>
            <StackPanel Name="AbstractPanel" Orientation="Horizontal" Height="100" VerticalAlignment="Top"/>
            <StackPanel Name="ShapesPanel" Orientation="Horizontal" Height="100" VerticalAlignment="Top"/>
            <StackPanel Name="MiscPanel" Orientation="Horizontal" Height="100" VerticalAlignment="Top"/>
        </StackPanel>
    </ScrollViewer>
    <Button Name="CancelButton"  VerticalAlignment="Bottom" Style="{DynamicResource RedButton}" Click="CancelButton_Click">Cancel</Button>
    <Border Name="LoadingBorder" Background="Black">
        <TextBlock Name="LoadingLabel" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,150" FontSize="20" FontWeight="Bold">
                <Run>Loading Pictures</Run>
                <LineBreak></LineBreak>
                <Run>Please Wait...</Run>
        </TextBlock>
    </Border>
</Grid>
  

Вот код за окном:

 namespace RandomApplication.Windows
{
public partial class ChooseProfilePic : Window
{
    private readonly BackgroundWorker _loadPictureWorker = new BackgroundWorker();

    public ChooseProfilePic()
    {
        InitializeComponent();
        Topmost = true;

        _loadPictureWorker.DoWork  = LoadImages;
        _loadPictureWorker.RunWorkerCompleted  = LoadImages_Completed;
    }

    private void On_ContentRendered(object sender, EventArgs e)
    {
        _loadPictureWorker.RunWorkerAsync();
    }

    private void CancelButton_Click(object sender, RoutedEventArgs e)
    {
        DialogResult = false;
        Close();
    }

    private void LoadImages(object sender, DoWorkEventArgs e)
    {
        try
        {
            var headsImagePath = AppDomain.CurrentDomain.BaseDirectory   @"ImagesProfile PicsHeads";
            var abstractImagePath = AppDomain.CurrentDomain.BaseDirectory   @"ImagesProfile PicsAbstract";
            var shapesImagePath = AppDomain.CurrentDomain.BaseDirectory   @"ImagesProfile PicsShapes";
            var miscImagePath = AppDomain.CurrentDomain.BaseDirectory   @"ImagesProfile PicsMisc";

            List<string> headsImageList = GetImages(headsImagePath);
            List<string> abstractImageList = GetImages(abstractImagePath);
            List<string> shapesImageList = GetImages(shapesImagePath);
            List<string> miscImageList = GetImages(miscImagePath);

            Application.Current.Dispatcher.Invoke(() =>
            {
                LoadViewingPanel(headsImageList, HeadsPanel);
                LoadViewingPanel(abstractImageList, AbstractPanel);
                LoadViewingPanel(shapesImageList, ShapesPanel);
                LoadViewingPanel(miscImageList, MiscPanel);
            });
        }

        catch (Exception ex)
        {
            CustomMessageBox.Show("Could not load images. :-(", "Image Retrieval Failed", MessageBoxButton.OK,
                MessageBoxImage.Error);
            Helper.WriteException(Helper.ErrorLogs   "Error Loading Images.txt", ex);
        }
    }

    private void LoadImages_Completed(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            CustomMessageBox.Show("Could not load images. :-(", "Image Retrieval Failed", MessageBoxButton.OK,
                MessageBoxImage.Error);
            Helper.WriteException(Helper.ErrorLogs   "Error Loading Images.txt", e.Error);
        }

        else LoadingBorder.Visibility = Visibility.Hidden;
    }

    public List<string> GetImages(string imagePath)
    {
        var that = GetAllFiles(imagePath);
        return that.ToList();
    }

    private void LoadViewingPanel(List<string> list, StackPanel panel)
    {
        foreach (var imageString in list)
        {
            Helper.WriteLineToFile(Helper.ErrorLogs   "2nd Info Loading Images.txt", imageString);
            var thisUri = new Uri(imageString, UriKind.RelativeOrAbsolute);
            var pic = new ProfilePic {ProfilePicImage = {Source = new BitmapImage(thisUri)}};
            panel.Children.Add(pic);
        }
    }

    private IEnumerable<string> GetAllFiles(string path)
    {
        return Directory.EnumerateFiles(path, "*.jpg").Union(
            Directory.EnumerateDirectories(path).SelectMany(d =>
            {
                try
                {
                    return GetAllFiles(d);
                }
                catch
                {
                    return Enumerable.Empty<string>();
                }
            }));
    }
}
}
  

Я исследовал, что может вызвать проблемы с этой конкретной dll, но, похоже, ничто из этого не связано с моей проблемой.

Ответ №1:

Итак, я разобрался с проблемой. По-видимому, размер изображений, которые я пытался загрузить, был слишком большим. Все изображения имели размер 2048×2048 пикселей, что делало их размером от 180 до 380 КБ. По-видимому, это слишком много. Я изменил размер всех изображений до 100×100 пикселей (поскольку я представлял их пользователю только как 100×100), что уменьшило размеры файлов до 7-10 КБ каждый. После этого они загрузились просто отлично, без сбоев.