1

我在 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 触发器为我工作吗?

4

1 回答 1

0

如果我理解正确,则每次从另一个主菜单选项导航回来时,您都希望从子菜单中清除单选按钮上的选择。

为了解决这个问题,您可以通过手动将RadioButton 的 IsChecked属性值设置为false来“取消选中”每个Radio Button 。可能的解决方案如下:

如果您想在每次导航到主菜单的不同部分时从子菜单中清除任何选中的选项,您可以首先通过在选择并单击不同的选项后使用EventAggregator发布事件来通知子菜单的 ViewModel MainMenu按钮,来自Main Menu 的 ViewModel的SelectionChangedEventHandler方法。

因此,已发布事件的Sub-Menu EventHandler会将每个RadioButton 的 IsChecked属性值更新为false,这可以通过在View上定义的每个IsChecked属性和每个布尔值之间使用“双向”绑定完成在ViewModel上实现的RadioButton1IsChecked"属性。

我希望这对你有所帮助。

于 2013-11-08T17:45:32.797 回答