【问题标题】:Using ViewDiscovery in Prism to construct a simple menu structure使用 Prism 中的 ViewDiscovery 构建简单的菜单结构
【发布时间】:2020-06-05 21:22:18
【问题描述】:

我正在尝试将我的 MenuItems 分解为单独的视图,以便我的应用程序更易于管理。我的意图是在初始化时使用视图发现来构建菜单结构。我的文件菜单位于Menu1Region,我的编辑菜单位于Menu2Region。当我运行应用程序时,文件和编辑菜单不会下拉,并且标题周围有很多间距,右侧有一个子菜单箭头。任何帮助将不胜感激。

MainWindow.xaml

<Window x:Class="PrismDemo.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Height="350" Width="525" >    
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Menu>
            <ContentControl prism:RegionManager.RegionName="Menu1Region" />
            <ContentControl prism:RegionManager.RegionName="Menu2Region" />
        </Menu>
    </Grid>
</Window>

ModuleAModule.cs

using ModuleA.Views;
using Prism.Ioc;
using Prism.Modularity;
using Prism.Regions;

namespace ModuleA
{
    public class ModuleAModule : IModule
    {
        public void OnInitialized(IContainerProvider containerProvider)
        {
            IRegionManager _regionManager = containerProvider.Resolve<IRegionManager>();
            _regionManager.RegisterViewWithRegion("Menu1Region", typeof(ViewA));
            _regionManager.RegisterViewWithRegion("Menu2Region", typeof(ViewB));
        }

        public void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }
    }
}

ViewB.xaml

<MenuItem Header="Edit"
    x:Class="ModuleA.Views.ViewB"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="True">
    <MenuItem Header="_Copy" />
    <MenuItem Header="P_aste" />
</MenuItem>

ViewA.xaml

<MenuItem Header="File"
    x:Class="ModuleA.Views.ViewA"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="True">
    <MenuItem Header="Save" />
    <MenuItem Header="SaveAs" />
</MenuItem>

【问题讨论】:

  • 我想知道是否需要自定义区域适配器来在菜单中显示视图?
  • 我想知道将ContentControl 放在Menu 中是否有意义?

标签: c# wpf prism


【解决方案1】:

虽然我最初想将MenuItem 定义为区域,但我决定将Menu 定义为区域并使用StackPanel。似乎只有一个小问题。当一个菜单被下拉时,将鼠标移到相邻的菜单不会自动下拉相邻的菜单,用户必须点击进入。

MainWindow.xaml

<Window x:Class="PrismDemo.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Height="350" Width="525" >    
    <Grid ShowGridLines="True">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel Orientation="Horizontal">
            <ContentControl prism:RegionManager.RegionName="Menu1Region" />
            <ContentControl prism:RegionManager.RegionName="Menu2Region" />
        </StackPanel>        
    </Grid>
</Window>

ViewA.xaml

<Menu
    x:Class="ModuleA.Views.ViewA"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="True">
    <MenuItem Header="File">
        <MenuItem Header="Save" />
        <MenuItem Header="SaveAs" />
    </MenuItem>
</Menu>

ViewB.xaml

<Menu
    x:Class="ModuleA.Views.ViewB"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="True">
    <MenuItem Header="Edit">
        <MenuItem Header="_Copy" />
        <MenuItem Header="P_aste" />
    </MenuItem>
</Menu>

【讨论】:

    【解决方案2】:

    Menu 是一个ItemsControl,因此不需要包含ContentControl。以下是对原始帖子所需的更改。感谢 Brian Lagunas 在这方面的帮助。

    MainWindow.xaml

    <Window x:Class="PrismDemo.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:mi="clr-namespace:ModuleA.Views;assembly=ModuleA"   
            xmlns:prism="http://prismlibrary.com/"
            prism:ViewModelLocator.AutoWireViewModel="True"
            Height="350" Width="525" >    
        <Grid ShowGridLines="True">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Menu prism:RegionManager.RegionName="MenuRegion" />
        </Grid>
    </Window>
    

    ModuleAModule.cs

    using ModuleA.Views;
    using Prism.Ioc;
    using Prism.Modularity;
    using Prism.Regions;
    
    namespace ModuleA
    {
        public class ModuleAModule : IModule
        {
            public void OnInitialized(IContainerProvider containerProvider)
            {
                IRegionManager _regionManager = containerProvider.Resolve<IRegionManager>();
                _regionManager.RegisterViewWithRegion("MenuRegion", typeof(ViewA));
                _regionManager.RegisterViewWithRegion("MenuRegion", typeof(ViewB));
            }
    
            public void RegisterTypes(IContainerRegistry containerRegistry)
            {
    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 2021-05-28
      • 2013-10-20
      • 1970-01-01
      • 2010-12-23
      • 2016-07-11
      相关资源
      最近更新 更多