在MT环境中使用.Net Core对桌面应用程序进行属性更改的推荐方法是什么

问题描述 投票:-1回答:1

在过去10年中,我将WPF与“ Dispatcher”一起使用,以确保UI线程将收到通知。我在基本的“模型”类中使用了这样的代码:

[NotifyPropertyChangedInvocator]
public void RaisePropertyChanged([CallerMemberName] String propertyName = "")
{
    var propertyChanged = PropertyChanged;

    if (propertyChanged != null)
    {

        if (Dispatcher == null) // For console App
        {
            propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        else
        {
            if (Dispatcher.CheckAccess())
            {
                propertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
            else
            {
                Dispatcher.Invoke(new Action(() => propertyChanged(this, new PropertyChangedEventArgs(propertyName))));
            }
        }
    }
}

在此SO Question中,有一些关于AsynContext的讨论,另一个似乎添加了nuget包“ Microsoft.NET.Sdk.WindowsDesktop”,它似乎依赖于Windows OS。

在新的桌面应用程序中,推荐的等效方法是什么?调度员在哪里?有什么等效的吗?我们可以保持代码操作系统独立吗?我们是否应该再等几个月才能让Microsoft提供与操作系统无关的解决方案?

c# wpf inotifypropertychanged dispatcher os-dependent
1个回答
0
投票

WPF仍然仅在Windows上运行,并且Dispatcher仍然存在,因此您的问题尚不清楚。

如果要开发一个类库,以供运行在不同平台上的不同客户端应用程序使用,则可以将Dispatcher隐藏在一个接口后面,然后在每个受支持的客户端平台中实现该接口。

接口:

public interface IDispatcher
{
    bool CheckAccess();
    void Invoke(Action action);
}

查看模型:

public ViewModel(IDispatch dispatcher) { ... }

WPF实现:

public class WpfDispatcher : IDispatcher
{
    private readonly Dispatcher _dispatcher;

    public WpfDispatcher(Dispatcher dispatcher) =>
        _dispatcher = dispatcher;

    public bool CheckAccess() => _dispatcher.CheckAccess();

    public void Invoke(Action action) => _dispatcher.Invoke(action);
}
© www.soinside.com 2019 - 2024. All rights reserved.