gpt4 book ai didi

c# - WPF 事件 : BitmapImage PropertyChanged: "Calling Thread Cannot access"

转载 作者:太空宇宙 更新时间:2023-11-03 20:46:13 25 4
gpt4 key购买 nike

我试图理解以下代码是什么非常满意加载文本文件并显示其内容,但满意加载 BitmapImage 并将其显示在 timer.Elapsed 事件处理程序上。

我知道它与 UI 线程有关。

但为什么这对文本文件示例来说不是问题?

首先是 XAML:

<Window x:Class="WpfApplication7.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">

<StackPanel Orientation="Vertical">

<TextBlock Text="{Binding Path=Message, UpdateSourceTrigger=PropertyChanged}" FontSize="20" Height="40" Width="300" Background="AliceBlue" />

<Image Source="{Binding Path=Image,UpdateSourceTrigger=PropertyChanged}" Height="100" Width="100"/>

</StackPanel>
</Window>

和 C#,它在计时器上引发 PropertyChangedEventHandler:

using System;
using System.ComponentModel;
using System.Timers;
using System.Windows;
using System.IO;
using System.Windows.Threading;
using System.Windows.Media.Imaging;

namespace WpfApplication7
{
public partial class Window1 : Window, INotifyPropertyChanged
{
public BitmapImage Image { get; private set; }
public string Message { get; set; }
public event PropertyChangedEventHandler PropertyChanged = delegate { };

private Timer timer;

public Window1()
{
InitializeComponent();
this.DataContext = this;

this.timer = new Timer { Enabled = true, Interval = 100 };

this.timer.Elapsed += (s, e) =>
{
//---happy loading from text file. UI updates :)
this.Message = File.ReadAllText(@"c:\windows\win.ini").Substring(0, 20);
PropertyChanged(this, new PropertyChangedEventArgs("Message"));

//---not happy loading a BitmapImage. PropertyChanged unhappy :(
// (Don't make me have to: ! )
//Application.Current.Dispatcher.Invoke(
//DispatcherPriority.Send, new Action(delegate
//{

this.Image = new BitmapImage(new Uri(@"C:\WINDOWS\Web\Wallpaper\Ascent.jpg"));

//Edit --Ah hah, thanks Daniel !
// DependencyObject-> Freezable-> Animatable->
// ImageSource-> BitmapSource-> BitmapImage
this.Image.Freeze(); //<--- this will fix it, no need for Dispatcher

//Without Dispatcher or Freeze() ... right here:
//"The calling thread cannot access this object because a different thread owns it."
PropertyChanged(this, new PropertyChangedEventArgs("Image"));
//}));
};
}
}
}

我知道我可以用“Application.Current.Dispatcher.Invoke”来解决这个问题。所以修复它不是问题。不明白为什么我必须这样做是问题:)

类似问题

最佳答案

我认为这两种情况的关键区别在于 BitmapImage 是一个依赖对象,这意味着它具有“拥有”线程(创建对象的线程)的概念。当您的主 UI 线程尝试访问在另一个线程上创建(并由其拥有)的 BitmapImage 对象时……砰!

另一方面,字符串没有“拥有”线程的概念。

关于c# - WPF 事件 : BitmapImage PropertyChanged: "Calling Thread Cannot access",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/794882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com