在Prism中使用ViewDiscovery构建简单的菜单结构

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

我正在尝试将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>
c# wpf prism
1个回答
0
投票

尽管我本来想将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>
© www.soinside.com 2019 - 2024. All rights reserved.