【问题标题】:Windows 8.1 Store App->Prism Framework-usage of Regions (UI Composition)Windows 8.1 Store App->Prism Framework-Regions的使用(UI组合)
【发布时间】:2014-06-18 07:19:36
【问题描述】:

我正在为 Windows 8.1 Store App 使用 Prism 框架。 我想使用类似于使用 Prism 组合包(区域管理器)的桌面应用程序的机制来实现动态视图注入。

如果你们在以下方面指导我,我将不胜感激:-

  1. 我们是否有兼容 Windows Store App (Win RT) 的 Prism Composition 包。如果是,它叫什么名字。
  2. 如果不是,那么任何关于如何通过 Unity 或其他方式实现相同目标的建议。

非常感谢。

谢谢 山姆

【问题讨论】:

  • 大家有什么想法吗?我也很想知道,实现这一目标的最佳方法是什么..

标签: c# xaml winrt-xaml prism windows-8.1


【解决方案1】:

Prism for Windows Runtime 不像 Prism for WPF 那样提供区域机制。

实现类似的目标并不容易实现。我会想办法实现这一点并回复你。

谢谢,

伊泽奎尔

【讨论】:

  • 感谢 Ezequiel,我也在探索以下可能性:- a。通过自定义 DataTemplateSelector。但它不起作用。我假设 DataTemplateSelector 不适用于动态模板注入。湾。使用行为 SDK,DataTriggerBehavior。但仍然没有运气。请让我知道,你的想法。再次感谢。--山姆
【解决方案2】:

我学会了。首先,我尝试将所有课程等移动到 winrt。我从 WPF 中看到了许多依赖。 区域管理器的主要功能 - 附加属性在 contentcontrol 和 itemscontrol 中创建视图。在我的简单示例中,我没有使用弱引用等。您可以自己改进它。但它有效(我试过))

public class RegionManager
{
    private static readonly Dictionary<string, Func<object>> RegisteredContent = new Dictionary<string, Func<object>>();

    public static readonly DependencyProperty RegionNameProperty = DependencyProperty.RegisterAttached("RegionName", typeof(string), typeof(RegionManager), new PropertyMetadata(null));

    public static void SetRegionName(DependencyObject target, string name)
    {
        target.SetValue(RegionNameProperty, name);
        if (string.IsNullOrEmpty(name)) return;
        CreateContentRegion(target, name);
    }

    public static string GetRegionName(DependencyObject target)
    {
        return (string)target.GetValue(RegionNameProperty);
    }

    public void RegisterViewWithRegion(string regionName, Func<object> getContentDelegate)
    {
        RegisteredContent.Add(regionName, getContentDelegate);
    }

    private static void CreateContentRegion(DependencyObject target, string name)
    {
        if (target is ContentControl)
        {
            Func<object> value;
            RegisteredContent.TryGetValue(name, out value);
            if (value == null) return;
            ((ContentControl)target).Content = value.DynamicInvoke();
        }
    }
}

在 app.cs 你需要:

ealed partial class App
{
    readonly IUnityContainer _container = new UnityContainer();
    readonly RegionManager _regionManager = new RegionManager();
    public App()
    {
        InitializeComponent();
    }

    protected override Task OnLaunchApplicationAsync(LaunchActivatedEventArgs args)
    {
        NavigationService.Navigate("Main", null);
        return Task.FromResult<object>(null);
    }

    protected override Task OnInitializeAsync(IActivatedEventArgs args)
    {
        var locator = new UnityServiceLocator(_container);
        ServiceLocator.SetLocatorProvider(() => locator);
        _container.RegisterInstance(SessionStateService);
        _container.RegisterInstance(NavigationService);
        _container.RegisterInstance(_regionManager);
        _container.RegisterInstance<IEventAggregator>(new EventAggregator());

        ViewModelLocationProvider.SetDefaultViewModelFactory(viewModelType => _container.Resolve(viewModelType));
        InizializeRegionManager();

        return Task.FromResult<object>(null);
    }

    private void InizializeRegionManager()
    {
        var region = _container.Resolve<RegionManager>();
        region.RegisterViewWithRegion("RegionName", () => _container.Resolve<RegionView>());
    }

如果你愿意,你可以做得更好。您可以编写模块等

【讨论】:

    猜你喜欢
    • 2015-08-14
    • 2015-03-18
    • 2014-03-25
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多