微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Dispatcher设置Image.Source属性?

如何解决如何使用Dispatcher设置Image.Source属性?

| 我尝试使用以下建议:http://msdn.microsoft.com/zh-cn/library/ms741870.aspx(\“处理具有后台线程的阻止操作\”)。 这是我的代码
  public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender,RoutedEventArgs e)
        {
            ;
        }

        private void Process()
        {
            // some code creating BitmapSource thresholdedImage

            ThreadStart start = () =>
            {
                dispatcher.BeginInvoke(
                    System.Windows.Threading.dispatcherPriority.normal,new Action<ImageSource>(Update),thresholdedImage);
            };
            Thread nt = new Thread(start);
            nt.SetApartmentState(ApartmentState.STA);
            nt.Start();
        }

        private void button1_Click(object sender,RoutedEventArgs e)
        {
            button1.IsEnabled = false;
            button1.Content = \"Processing...\";

            Action action = new Action(Process);
            action.BeginInvoke(null,null);
        }

        private void Update(ImageSource source)
        {
            this.image1.source = source; // ! this line throw exception

            this.button1.IsEnabled = true; // this line works
            this.button1.Content = \"Process\"; // this line works
        }
    }
标记的行中,它引发InvalidOperationException \“,因为调用线程无法访问此对象,因为另一个线程拥有它。\”。但是,如果我删除此行,则应用程序有效。
XAML:
<!-- language: xaml -->
    <Window x:Class=\"BlackZonesRemover.MainWindow\"
            xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"
            xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"
            xmlns:my=\"clr-namespace:BlackZonesRemover\"
            Title=\"MainWindow\" Height=\"600\" Width=\"800\" Loaded=\"Window_Loaded\">
        <Grid>
            <Grid.RowDeFinitions>
                <RowDeFinition />
                <RowDeFinition Height=\"Auto\" />
            </Grid.RowDeFinitions>
            <Border Background=\"LightBlue\">
                <Image Name=\"image1\" Stretch=\"Uniform\" />
            </Border>
            <Button Content=\"Button\" Grid.Row=\"1\" Height=\"23\" Name=\"button1\" Width=\"75\" Margin=\"10\" Click=\"button1_Click\" />
        </Grid>
    </Window>
Image.source属性与Button.IsEnabled和Button.Content属性之间有什么区别?我能做什么?     

解决方法

        具体建议:正在后台线程上创建“ 2”。在UI线程上创建它,或者一旦创建它就冻结它。 一般建议:区别在于
ImageSource
DependencyObject
,因此具有线程相似性。因此,您需要在与要分配给它的ѭ6相同的线程上创建
ImageSource
(即UI线程),或者一旦创建了它,就需要在need3ѭ上创建
Freeze()
,从而允许任何线程访问它。     ,        问题是因为在后台线程中创建了“ 9”,并在UI线程上使用了它。 调用冻结方法可能会有所帮助。看到 从BackgroundWorker线程更新Image UI属性     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?