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

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(使用前将#替换为@)

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

  • 如何在Phone类库项目中添加ResourceDictionary并访问它

    我正在开发一个项目 其中我有一个引用图书馆项目的子项目 在我的库项目 电话类库 中 如何创建 ResourceDictionary xaml 其中我需要添加一些样式并在 xaml 文件和 cs 文件中使用它 我需要访问 xaml 文件中的
  • 将 Combobox 控件绑定到 DataGrid 中的单独源

    我尝试在 DataGrid 中使用 ComboBox 这将允许用户选择来自不同表的值 我使用 ViewModel 类作为 DataContext 其中包含一个用于终端的 ObservableCollection 和另一个用于 Termina
  • WPF 日历控件按住鼠标

    所以我放弃了标准的 WPFCalendarVS2010 中全新 WPF 应用程序中的 MainWindow xaml 控件 如果我单击日历中的某一天 然后尝试单击应用程序的 关闭 按钮 则我必须在关闭按钮上单击两次才能接受单击 它的表现就好
  • RichTextbox SelectionStart 返回错误的索引

    我需要向用户显示光标上文本的选择开始和长度 就像在 notepad exe 中一样 选择长度没有问题 因为 Richtextbox 支持带有开始和结束的选择属性 http msdn microsoft com en us library s
  • 何时为 WPF/MVVM 使用事件和命令?

    我正在练习如何使用 MVVM 模式编写 WPF 应用程序 到目前为止 我还没有在我的代码中使用命令 在我的视图模型中我实现INotifyPropertyChanged并使用 事件PropertyChangedEventHandler Pro
  • 带 Prism 的表单:应用程序窗口预计有一个根 VC

    我刚刚在我的新应用程序中实现了 Prism 库 并且正在使用 NavigationService 它在 Android 上运行良好 但是当我尝试在联网的 Mac 上调试我的 Xamarin Forms iOS 应用程序时 我的 Main 方
  • 为什么我的 WPF 复选框绑定不起作用?

    我正在使用 MVVM VS 2008 和 NET 3 5 SP1 我有一个项目列表 每个项目都公开一个 IsSelected 属性 我添加了一个复选框来管理列表中所有项目的选择 取消选择 更新每个项目的 IsSelected 属性 一切正常
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • System.Windows.Controls.WebBrowser、System.Windows.Threading.Dispatcher 和 Windows 服务

    我正在尝试将一些 html 内容渲染为 Windows 服务中的位图 我正在使用 System Windows Controls WebBrowser 来执行渲染 基本渲染设置作为一个独立进程运行 并带有托管控件的 WPF 窗口 但作为服务
  • ComboBox.SourceUpdated 事件未触发

    我的视图中有两个组合框 它们都绑定到两个不同的ObservableCollections在 ViewModel 中 当 ComboBox1 中的选定项发生更改时 ComboBox2 将使用不同的集合进行更新 绑定工作得很好 但是 我希望第二
  • Android 在 WPF 中的涟漪效应

    我喜欢 Android 的新动画 当你触摸一个控件 listviewitem 按钮等 时 它会执行如下所示的简洁动画 我想知道如何在全球范围内为 WPF 中的所有 可点击 控件以良好的方式实现这一点 我特别需要帮助的是如何在控件上创建圆圈
  • 多边形边界与具有 ScaleTransform 的画布上的视觉效果不匹配

    以下 XAML 只是画布上缩放为 x2000 的多边形 当鼠标悬停在多边形上时 有一个触发器会更改多边形的填充颜色 为什么当您将鼠标悬停在多边形上方和左侧时 框会改变颜色
  • 当 ValidationRules 无法共享时,在 DataTemplates 中重新使用绑定实例

    我正在寻找解决方案和 或为什么在 DataTemplate 中共享 Binding 实例背后的合理性 这最终归结为这样一个事实 在 DataTemplate 中 似乎没有办法为生成的每个控件强制在 DependencyProperty 上绑
  • 控制台项目中的 WPF 窗口?

    我最近启动了一个 C 项目 VS 2008 作为 控制台 项目 我在其中编写了一些库 测试程序等 现在我想添加几个 WPF 窗口 但看起来控制台项目不会让我这样做 我来自 Java 所以这有点奇怪 如何添加 WPF 表单 我将从 主 类中实
  • 为什么有时Task明显慢于Thread?

    我正在使用 MVVM 模式制作 WPF 应用程序 我发现有时任务明显慢于线程 例如 在测试 ViewModel 中 public void DoSomething Stopwatch stopwatch Stopwatch StartNew
  • WPF 自定义 TabItem - 控件未显示在 Visual Studio 设计器中

    我创建了一个自定义 TabItem 其中包含 DockPanel 和 Button XAML
  • WPF 中可选择的 TextBlock 或带有格式化文本的 TextBox

    我遇到一种情况 我需要显示格式化文本 正常 粗体 突出显示 并且还应该是可选择的 以便用户可以复制文本 我使用了文本块 我可以使用内联内容流元素应用多种格式 但不幸的是它的文本不可选择 虽然文本框允许选择文本并复制到剪贴板 但它不允许我设置
  • 有没有办法对 RichTextBox 的撤消历史进行分组或暂时禁用它?

    我目前正在研究 WPF 中 RichTextBox 内的表格 在 WPF 中 表格没有行和列 只有行 每行都有一定数量的单元格 当用户按下 添加列 按钮时 我的程序会向每一行添加一个新单元格 使用此方法的问题是 在用户添加一列后 如果他们按
  • 如何使用 MVVM 更改数据网格或列表视图中的内容

    我有一个 MainWindowViewModel DataContext 它公开不同的 ObservableCollections 带有 INotifyProperty 的 poco 对象的视图模型 从组合框中选择一个值后 我想单击一个加载

随机推荐

  • 像这样使用 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 问题在于 当在