菜单作为棱镜区域+主题问题

2024-01-03

我使用菜单控件作为区域。它工作正常,但是当我向应用程序添加主题(向我的 App.xaml 添加资源字典)时,正常菜单具有该主题,但我区域内的视图(菜单项)没有该主题。

其背后的原因可能是什么?有人有解决方法的想法吗?

Alex.


问题在于,当在 MenuItem 内使用该区域时,该区域的 ItemsControl 会设置样式,但其子项不会设置样式。我通过使用各种来源的动态菜单找到了解决方法:

WPF 示例系列 – 数据绑定 HierarchicalDataTemplate 菜单示例 http://karlshifflett.wordpress.com/2008/02/03/wpf-sample-series-databound-hierarchicaldatatemplate-menu-sample/

使用 HierarchicalDataTemplate 构建数据绑定 WPF 菜单 http://xamlcoder.com/cs/blogs/joe/archive/2008/11/25/building-a-databound-wpf-menu-using-a-hierarchicaldatatemplate.aspx

我在基础设施项目中创建了 IMenuService 和 MenuItemViewModel,在 Shell 项目中实现 IMenuService,并在模块中使用 IMenuService 添加菜单。

public interface IMenuService
{
    List<MenuItemViewModel> Menu { get; set; }
    MenuItemViewModel FileMenu { get; set; }
}

public class MenuItemViewModel : NotificationObject
{
    private string _header;
    private bool _isEnabled = true;
    private ICommand _command;
    private Image _icon;
    private string _inputGestureText;
    private ObservableCollection<MenuItemViewModel> _children;

    public MenuItemViewModel()
    {
        Children = new ObservableCollection<MenuItemViewModel>();
    }

    public MenuItemViewModel(bool isSeparator) : this()
    {
        _isSeparator = isSeparator;
    }

    public string Header
    {
        get { return _header; }
        set
        {
            _header = value;
            RaisePropertyChanged("Header");
        }
    }

    public bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            _isEnabled = value;
            RaisePropertyChanged("IsEnabled");
        }
    }

    public ICommand Command
    {
        get { return _command; }
        set
        {
            _command = value;
            RaisePropertyChanged("Command");
        }
    }

    public Image Icon
    {
        get { return _icon; }
        set
        {
            _icon = value;
            RaisePropertyChanged("Icon");
        }
    }

    public string InputGestureText
    {
        get { return _inputGestureText; }
        set
        {
            _inputGestureText = value;
            RaisePropertyChanged("InputGestureText");
        }
    }

    public ObservableCollection<MenuItemViewModel> Children
    {
        get { return _children; }
        set { _children = value; }
    }

    private bool _isSeparator;
    public bool IsSeparator
    {
        get { return _isSeparator; }
        set { _isSeparator = value; }
    }
}

Shell 项目中的 MenuService:

[Export(typeof(IMenuService))]
public class MenuService : IMenuService
{
    [ImportingConstructor]
    public MenuService()
    {
        _menu = new List<MenuItemViewModel>();
        _fileMenu = new MenuItemViewModel {Header = "_File"};
        _fileMenu.Children.Add(new MenuItemViewModel { Header = "_New" });
        _fileMenu.Children.Add(new MenuItemViewModel(true)); // Separator

        _menu.Add(_fileMenu);
    }

    private static Image CreateImage(string url)
    {
        var image = new Image
                        {
                            Source = new BitmapImage(new Uri("Resources/" + url, UriKind.Relative)),
                            Height = 16,
                            Width = 16
                        };
        RenderOptions.SetBitmapScalingMode(image, BitmapScalingMode.NearestNeighbor);
        return image;
    }

    private List<MenuItemViewModel> _menu;
    public List<MenuItemViewModel> Menu
    {
        get { return _menu; }
        set { _menu = value; }
    }

    private MenuItemViewModel _fileMenu;
    public MenuItemViewModel FileMenu
    {
        get { return _fileMenu; }
        set { _fileMenu = value; }
    }
}

在 Shell.xaml 中

<Window.Resources>
    <Style TargetType="{x:Type MenuItem}" x:Key="separatorStyle">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type MenuItem}">
                    <Separator HorizontalAlignment="Stretch" IsEnabled="False"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style BasedOn="{StaticResource {x:Type MenuItem}}" TargetType="{x:Type MenuItem}">
        <Setter Property="Command" Value="{Binding Command}"/>
        <Setter Property="Icon" Value="{Binding Icon}"/>
        <Setter Property="InputGestureText" Value="{Binding InputGestureText}"/>
        <Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
    </Style>

    <HierarchicalDataTemplate DataType="{x:Type infrastructure:MenuItemViewModel}" ItemsSource="{Binding Path=Children, UpdateSourceTrigger=PropertyChanged}">
        <ContentPresenter Content="{Binding Header}" RecognizesAccessKey="True" />
    </HierarchicalDataTemplate>

    <local:SeparatorStyleSelector x:Key="separatorStyleSelector"/>

在 ShellViewModel 中:

[ImportingConstructor]
    public ShellViewModel(IMenuService menuService)
    {
        Menu = menuService.Menu.ToObservableCollection();
    }

    private ObservableCollection<MenuItemViewModel> _menu = new ObservableCollection<MenuItemViewModel>();
    public ObservableCollection<MenuItemViewModel> Menu
    {
        get { return _menu; }
        set
        {
            _menu = value;
            RaisePropertyChanged("MenuItems");
        }
    }

从模块添加菜单:

[ModuleExport(typeof(OptionModule))]
public class OptionModule : IModule
{
    [ImportingConstructor]
    public OptionModule(IMenuService menuService)
    {
        menuService.ToolsMenu.Children.Add(new MenuItemViewModel {Header = "Options", Command = OptionCommand});
    }
}

这是上面 Karl 网站上的 SeparatorStyleSelector:

public override Style SelectStyle(object item, DependencyObject container)
    {
        if (((MenuItemViewModel)item).IsSeparator)
        {
            return (Style) ((FrameworkElement) container).FindResource("separatorStyle");
        }
        return base.SelectStyle(item, container);
    }
enter code here
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

菜单作为棱镜区域+主题问题 的相关文章

  • WPF - 检测鼠标按下一段时间

    检测鼠标按钮何时在特定元素上按住特定时间段的最佳方法是什么 感谢您的提示 我创建了一个附加属性以避免任何代码隐藏 using System using System Windows using System Windows Threadin
  • 转换BitmapImage后内存未释放

    我遇到以下 C 测试 代码的问题 public static void TestBitmap2ByteArray BitmapImage bitmap JpegBitmapEncoder encoder new JpegBitmapEnco
  • WPF DataGrid 绑定 DataGridCell 内容

    希望这将是一个非常简单的答案 我认为我只是没有看到众所周知的树木 我有一个 DataGridCell 样式 我想将单元格的内容绑定到图像的源属性 这是我目前使用的 XAML
  • 如何在wpf中打印屏幕截图

    首先我英语说得不太流利 反正 我正在尝试这样做 然而这还不是第三天 我现在正在做的是屏幕捕获后的程序屏幕打印 我参考这段代码 https social msdn microsoft com Forums windows en US 0623
  • 如何在 RichTextBox 中以编程方式移动插入符位置?

    我有一个 RichTextBox 其中的特殊文本位具有自定义格式 但是 存在一个错误 即插入字符后 插入符号会放置在新插入的字符之前而不是之后 这是因为对于每次编辑 代码都会重新计算内容以应用自定义格式 然后像这样设置 CaretPosit
  • 重写 WPF 工具包图表中的 DataPointStyle

    我想覆盖DataPointStyle of the LineSeries在我的 WPF 工具包中Chart
  • 比较运算符性能 <= 与 !=

    让我们首先声明代码可读性胜过微优化 我们应该将其留给编译器 这只是一个奇怪的案例 具体细节似乎与一般建议相比很有趣 因此 我在搞素数生成器函数 并提出了一种奇怪的行为 其中 人们建议效率最高 实际上效率最低 而 C private stat
  • 窗口关闭后仍在调用方法

    首先我不知道这是不是一个愚蠢的问题 我有这样的场景 首先我有一个主窗口 public MainWindow InitializeComponent dt is a System Windows Threading DispatcherTim
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 如何使 WPF 应用程序在 Web 浏览器上运行

    我们有一个用 WPF 编写的现有应用程序 我们正在寻找一种迁移它的方法 以便它可以在 Web 浏览器上运行 深入研究后 我们似乎需要找到一种将代码编译为 WebAssembly 的方法 但我不确定它对于现有的完全加载的 WPF 应用程序有多
  • 如何在运行时添加到 TreeView 目录

    我有一个TreeView我想允许用户添加和删除子项目 在探索基本功能时 我使用button and a textbox添加此子项 当用户点击button a new TreeViewItem需要创建并设置为我的父项的子项TreeView与t
  • WPF 处理文本、图像和文件粘贴事件

    我正在开发一个 WPF 应用程序 我想捕获 RichTextBox 输入中的粘贴命令并处理粘贴的文件 为此 我使用以下回调
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • .NET / C# / WPF 项目的命名约定

    NET C WPF 项目广泛接受的命名约定是什么 Microsoft 有一篇关于命名约定的内容广泛的 MSDN 文章here http msdn microsoft com en us library ms229002 aspx
  • 汉堡菜单棱镜xamarin形式?

    我正在尝试在 Xamarin Forms 中使用 Prism 创建一个应用程序 Xamarin 表单版本 2 3 3 175 棱镜版本 6 2 0 汉堡菜单可以在 Android 中使用 但是当我在 UWP 上运行它时 它不会显示图标 而且
  • 创建带有部分的选项卡式侧边栏 WPF

    我正在尝试创建一个带有部分的选项卡式侧边栏 如 WPF 中的以下内容 我考虑过几种方法 但是有没有更简单 更优雅的方法呢 方法一 列表框 Using a ListBox并将 SelectedItem 绑定到右侧内容控件所绑定的值 为了区分标
  • 将 BitmapImage 从 Resources.resx 分配给 Image.Source?

    我想分配一个BitmapImage从我的 Resources resx 到Image 之前我将 png 图像保存到 Resources resx 中 该图像现在位于 Resources logo png 中 在阅读了几篇 SO 帖子和其他文
  • WPF:如何避免图像超出 Canvas 的边界?

    我有一个画布作为图像查看器 它的背景用于放置图像 我想在其上面放置另一个图像 所以 场景是这样的
  • 如何使取消按钮像“X”按钮一样工作?

    在我的 XAML 文件中 我有一个窗口 我试图将其设置为无论用户单击 X 按钮还是单击 取消 按钮 行为都是相同的 我的缩写代码如下 public partial class Dialog Window private void Windo

随机推荐

  • 像这样使用 EF 将多个查询聚合为一个查询吗?

    我在我的应用程序中使用 EF 4 0 POCO 像这样检索信息有什么缺点吗 Given a customerId and a productId 我想应用一些业务规则 要求我从需要多次查询的数据库中获取大量微小的信息 相反 我可以编写一个查
  • 从 main “返回”的正确方法

    假设我们有这样的程序 int main int argc char argv if argc lt 3 printf usage details n return EXIT FAILURE dostuff return EXIT SUCCE
  • 如何仅从 DateTime 获取小时和分钟

    我可以说 2015 01 16 13 50 00 000 在我的数据库中 如何仅获取小时和分钟 13 50 最后我想像这样进行查询 更新 A 设置状态 1 WHERE endTime current time endTime 我上面示例的字
  • angular2 - 在组件之间传递数据对象

    如果可能的话 寻求一些帮助 我有一个位于一个组件中的数据对象 该数据对象是从 REST 调用接收到的 它包含我想跨组件共享的用户详细信息 但我遇到了麻烦 将此对象传递给另一个组件以便我可以使用详细信息的最佳方法是什么 前任 数据对象名为 u
  • 从序列化数据创建数字人物指纹模板

    这是一个非常具体的问题 可能会让我获得风滚草徽章 但如果可以的话请回答 我已经将 DigitalPersona sdk dll 作为类型库导入到 Delphi 中 并尝试验证我作为序列化数据存储在数据库中的指纹 它工作得非常好 注册似乎工作
  • Python数据帧检查列数据帧中的值是否在另一个数据帧中报告的值的范围内

    如果问题微不足道 我深表歉意 但作为一个Python新手 我无法找到正确的解决方案 我有两个数据帧 我需要向第一个数据帧添加一列 如果第一个数据帧的某个值位于第二个数据帧的两个值之间 则该列为 true 否则为 false 例如 first
  • function.fopen:无法打开流:PHP 中的权限被拒绝

    我正在尝试从 PHP 应用程序为我的网站创建 XML 站点地图 这个想法是创建一个新文件或覆盖现有文件 当我调用 fopen 时 出现以下错误 function fopen failed to open stream Permission
  • 如何在会话中使用get方法?

    这是我的代码 实际上 我在页面上显示来自 mysql 的一些数据并创建动态链接 我想在启动任何代码之前在代码的最开头使用 session start 启动一个会话 我想存储要在其他页面上显示的链接的值 page1 php a style c
  • 如何在安装过程中注册 Windows 服务?

    我在VB net 2008中构建了一个Windows服务应用程序 并使用安装向导添加了安装过程 安装程序可以工作 因为它添加了应用程序来添加 删除程序并复制所有文件等 但它缺少实际安装服务的最后 必需 步骤 我已将项目的主要输出添加为安装和
  • Sitemesh 有哪些替代方案可以帮助在 Spring MVC 应用程序中布局 JSP/JSTL 页面页脚/页眉?

    我尝试从我的 Sitemesh 装饰器中排除某些页面 但它似乎不遵循自己的逻辑
  • Mac 上应用程序数据和临时文件的存放位置

    我们有一个 Windows Java 桌面应用程序 可以创建一些配置文件 at APPDATA 并创造logs at TEMP 地点 现在我们计划发布 Mac OS X 的桌面应用程序 我们面临以下困难 我们不想将应用程序数据保留在 app
  • java中有序列表中的二分搜索[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种在java中实现代码的方法 其工作方式与有序ArrayList中的二分搜索相同 但对于有序列表 谢谢 您可以使用 Colle
  • 扩展 jqgrid 子网格

    我有一个带有子网格的 jqgrid 如何在无需单击加号的情况下展开子网格 我碰到 jqgrid id expandSubGridRow rowId 但我不确定使用哪个 rowId 来扩展子网格 Thanks Use jqgrid id ex
  • 与 POST 请求相比,使用 GET 请求有哪些优点?

    我的几个 ajax 应用程序过去使用过 GET 请求 但现在我开始使用 POST 请求 POST 请求似乎稍微更安全 而且绝对对 url 更友好 更漂亮 因此 我想知道是否有任何理由我应该使用 GET 请求 我一般是这样设置问题的 请求后有
  • 在用户的 gradle.properties 中设置 JDK 主目录(javac 路径)

    我需要指定路径javac在我的 Gradle 项目中 我可以通过将以下内容添加到我的build gradle file options forkOptions executable home mj lib jdk1 7 0 80 bin j
  • 如何在 ubuntu 12.0.4 上将 usr/local/bin 添加到路径环境变量?

    我刚刚在 Ubuntu 12 0 4 上安装了 ruby 1 8 6 我正在从一本书中学习 ruby 安装过程结束后它说 完成后 您应该将 usr local bin 添加到 PATH 环境变量中 我假设 作为一名 Linux 用户 我被困
  • 如何使用 ARRAYFORMULA 与上一行的偏移量而不会出现循环引用错误

    示例表 https docs google com spreadsheets d 14ma y3esh1S EkzHpFBvLb0GzDZZiDsSVXFktH3Rr E edit usp sharing https docs google
  • 如何更改 PR 合并提交消息?

    创建拉取请求时 其提交消息始终类似于 将 PR 从 branch name 合并到 targetbranch name 我不断修改提交消息 这有点累 我依靠提交消息来跟踪 因此自动消息会出现问题 这是Azure DevOps的一个功能 目的
  • 如何构建基于数据库的Spring Boot环境/属性源?

    目标是使用包含由数据库连接 数据源 加载和生成的键和值的环境来运行 Spring Boot 应用程序 或者 更抽象的定义 虽然应该首选仅通过文件进行配置 更快 更容易 更宽容 但有时您会发现需要基于非静态文件的配置的用例 Spring 3
  • 菜单作为棱镜区域+主题问题

    我使用菜单控件作为区域 它工作正常 但是当我向应用程序添加主题 向我的 App xaml 添加资源字典 时 正常菜单具有该主题 但我区域内的视图 菜单项 没有该主题 其背后的原因可能是什么 有人有解决方法的想法吗 Alex 问题在于 当在