我在 WPF 应用程序的左上角有一个区域,我希望它成为我的全局按钮栏,用户可以在其中选择他们想要查看的屏幕,然后适当的内容将显示在主区域中。右上角还会有一个子导航区域,该屏幕内有子菜单选项,例如,如果用户从主菜单中单击“维护”,子菜单将显示新建、更新、删除、编辑等选项。
我想要的是一种通过简单地指定文本按钮名称列表和 ICommand/Parameter 对来创建自定义菜单栏的方法,以便在按钮单击时调用该操作。执行此操作的自然方法是使用具有依赖属性 Title、Command 和 CommandParameter 的 MenuButtonViewModel 类。还需要一个 IsSelected,因此用户可以通过某种视觉方式查看您当前在哪个屏幕上,因此它需要表现得像一个切换按钮,但在该组中只能选择一个按钮时间。然后我可以拥有一个 UserControl,其中栏的内容绑定到 ObservableCollection 并使用数据模板来呈现按钮栏。
到目前为止,我已经尝试了几种方法来做到这一点,但无法找到一种能够给我想要的视觉行为的方法。这些是我的要求
1) Button 将背景更改为不同的 Brush OnMouseOver 2) 选择按钮时,将显示不同的 Brush 作为背景,直到选择了组中的新按钮,如切换按钮 IsSelected 行为 3) 组中只有一个按钮可以一次被选中
到目前为止我尝试过的方法是
1)用我自己的类扩展 RadioButton,为命令和命令参数添加依赖属性。将所有控件设置为具有相同的组 ID。覆盖单选按钮显示的数据模板,使其看起来像一个带有鼠标悬停触发器的可视按钮并被选中。
这工作正常,除了一件事。一旦您选择了组中的单选按钮,就无法取消选择单选按钮组中的所有选项。因此,例如,如果您导航到“维护”,然后单击“国家”的子菜单,则会显示国家维护屏幕。如果您随后转到应用程序的其他区域并从主菜单中选择“交易输入”,您将被带到交易输入屏幕。如果然后单击“维护”,它会显示通用的“维护”内容并带回用于维护的子菜单控件,其中在单选按钮组中选择了“国家”,但这是不可取的。当您导航回维护时,它应该取消选择所有子菜单选项,显示通用维护登录页面内容,并让您在显示该屏幕内容之前选择子菜单选项。第一次加载维护时,没有选择任何内容,但是一旦您选择了一个选项,那么当您重新加载维护屏幕时,就无法再次选择任何内容。
2)然后我尝试扩展一个ListBox,使用内容的水平堆栈面板对其进行样式设置,每个listboxitem都是一个menubuttonViewModel。这使我一次只能选择一个选项,并在您离开页面时清除选择。当您将鼠标悬停在每个列表框项上时,它还可以让我更改背景。
我无法使用列表框的一点是在 IsSelected 触发器上具有不同的背景。默认 ListBoxItem 模板上似乎有一些触发器会覆盖您在 CSS 中指定的任何内容,因此无论我在 listboxitem 或 menubuttonviewmodel 样式上放置什么触发器,背景都不会改变。我想我需要重新定义 listboxitem 的数据和内容模板,但只有它适用于这个列表框,所以它不能成为所有 listboxitem 的全局模板更改 - 因为我希望能够在应用程序的其他地方使用列表框不继承这种行为。
任何人都可以就这两种方法给出他们的想法,以及如何解决我不得不让其中一种以我想要的方式工作的问题,特别是如果你能建议我如何覆盖列表框的内容/数据模板我的风格,所以他们不使用默认触发器,我可以让 IsSelected 触发器为我工作吗?