1

我正在使用 C# 和 WPF,并试图沿屏幕滑动图像条。老实说,我从 Internet 上的一些代码示例中获取了代码,并从中获取了我需要的部分。

public double ImageOffset
{
    get
    {
        try
        {
            return (double)this.Dispatcher.Invoke(
               System.Windows.Threading.DispatcherPriority.Background,
               (DispatcherOperationCallback)delegate 
               { return GetValue(ImageOffsetProperty); }, ImageOffsetProperty);
        }
        catch
        {
            return (double)this.GetValue(ImageOffsetProperty);
        }
    }

    set
    {
        this.Dispatcher.BeginInvoke(DispatcherPriority.Background,
            (SendOrPostCallback)delegate 
            { SetValue(ImageOffsetProperty, (object)value); },
            (object)value);
    }
}

有时当程序试图获取 ImageOffsetPropertyInvalidOperationException: Cannot perform this operation while dispatcher processing is suspended时,我不知道如何修复它。

我也尝试过Dispatcher.BeginInvoke,将 ImageOffsetProperty 保存在 Double 中,然后返回它,但它总是返回 0。

是什么原因造成的InvalidOperationException

4

1 回答 1

1

放弃所有的Background东西,然后像这样编写一个标准的依赖属性包装器怎么样:

public double ImageOffset
{
    get { return (double)GetValue(ImageOffsetProperty); }
    set { SetValue(ImageOffsetProperty, value); }
}

当从后台线程设置属性时,将赋值放在Dispatcher.InvokeorDispatcher.BeginInvoke调用中。

代替

obj.ImageOffset = someOffset;

经过

Dispatcher.Invoke(() => obj.ImageOffset = someOffset);

或者

Application.Current.Dispatcher.Invoke(() => obj.ImageOffset = someOffset);

如果您无法直接访问Dispatcher某些 UI 元素的属性。

于 2013-10-25T12:54:31.367 回答