如何使用 WPF 功能区菜单并在同一视图中显示以下内容?
How do I use a WPF Ribbon menu and display the content below in the same view?
我是 WPF、MVVM 和 Ribbon 的新手。
基本上,我可以成功构建功能区菜单,添加按钮,我了解 MVVM 概念。
现在我正在努力将以上所有内容结合起来:功能区菜单与 MVVM 模型。
更具体地说,我想知道如何实现以下内容:
假设您有一个带 2 个 "tabs" 的功能区菜单:一个用于客户功能(添加、搜索...),一个用于库存管理(搜索库存、管理库存...)。
现在,每次我单击一个按钮(比如说功能区菜单中 "search customers" 的按钮),我希望显示一个搜索表单和下面的搜索结果,但不是在新的看法。
我想让它显示在同一个 view/window 中,但在功能区菜单下方。
因此,每次在功能区菜单中触发新的 "functionality" 时,我都想让它显示在同一个 window/view 中,一遍又一遍地重复使用我的主要 view/window。
我该如何实现这一点,基本上是 "updating" 主要 window 每次在带有新内容的功能区中单击新按钮时?
我用谷歌搜索了这个,我发现了各种教程和代码示例,它们要么只是演示构建功能区菜单(没有 MVVM 概念),要么只是演示 MVVM 概念但没有功能区菜单,...但是看在我的份上,我无法理解如何实现我上面描述的内容...
一般来说,当您想要更改内容时,您的视图中会有类似视图占位符的东西。这可能是完全不同的东西,例如 Itemscontrol(对于多个内容、一个 ContentPresenter 或只是一个文本块)
对于您的问题,我认为您可以简单地使用 ContentPresenter:
示例视图:
<UserControl x:Class="WpfApplication1.View.SampleVIew"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<DockPanel>
<!--Ribbon Menu-->
<Menu DockPanel.Dock="Top" />
<!--Your Content to Change-->
<ContentPresenter Content="{Binding CurrentContent}" />
</DockPanel>
</UserControl>
(而不是那个菜单,你有你的功能区。)
然后在你的 Viewmodel 中你有一个 ViewModel 属性
ViewModelBase _currentContent;
public ViewModelBase CurrentContent
{
get { return _currentContent; }
set
{
_currentContent = value;
RaisePropertyChanged(nameof(CurrentContent));
}
}
Raise属性Changed 方法只是引发 INotify属性Changed 接口的 属性Changed 事件,当你说你理解 mvvm 模式时,你认为你知道这一点。
然后在 RibbonButton 的方法中,只需将 CurrentContent 属性 更改为不同的 ViewModel。
public void MyCommandMethod()
{
this.CurrentContent = new DifferentViewModel();
}
ViewModel 应该通过 DataTemplates 映射到视图,例如:
<DataTemplate DataType="{x:Type my:DifferentViewModel}">
<local:MyUserControlForDifferentView />
</DataTemplate>
编辑:
我在开始使用 wpf 时找到的最好的教程是 Josh Smith 的文章:
this
我是 WPF、MVVM 和 Ribbon 的新手。 基本上,我可以成功构建功能区菜单,添加按钮,我了解 MVVM 概念。 现在我正在努力将以上所有内容结合起来:功能区菜单与 MVVM 模型。
更具体地说,我想知道如何实现以下内容: 假设您有一个带 2 个 "tabs" 的功能区菜单:一个用于客户功能(添加、搜索...),一个用于库存管理(搜索库存、管理库存...)。
现在,每次我单击一个按钮(比如说功能区菜单中 "search customers" 的按钮),我希望显示一个搜索表单和下面的搜索结果,但不是在新的看法。 我想让它显示在同一个 view/window 中,但在功能区菜单下方。 因此,每次在功能区菜单中触发新的 "functionality" 时,我都想让它显示在同一个 window/view 中,一遍又一遍地重复使用我的主要 view/window。
我该如何实现这一点,基本上是 "updating" 主要 window 每次在带有新内容的功能区中单击新按钮时?
我用谷歌搜索了这个,我发现了各种教程和代码示例,它们要么只是演示构建功能区菜单(没有 MVVM 概念),要么只是演示 MVVM 概念但没有功能区菜单,...但是看在我的份上,我无法理解如何实现我上面描述的内容...
一般来说,当您想要更改内容时,您的视图中会有类似视图占位符的东西。这可能是完全不同的东西,例如 Itemscontrol(对于多个内容、一个 ContentPresenter 或只是一个文本块)
对于您的问题,我认为您可以简单地使用 ContentPresenter:
示例视图:
<UserControl x:Class="WpfApplication1.View.SampleVIew"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<DockPanel>
<!--Ribbon Menu-->
<Menu DockPanel.Dock="Top" />
<!--Your Content to Change-->
<ContentPresenter Content="{Binding CurrentContent}" />
</DockPanel>
</UserControl>
(而不是那个菜单,你有你的功能区。) 然后在你的 Viewmodel 中你有一个 ViewModel 属性
ViewModelBase _currentContent;
public ViewModelBase CurrentContent
{
get { return _currentContent; }
set
{
_currentContent = value;
RaisePropertyChanged(nameof(CurrentContent));
}
}
Raise属性Changed 方法只是引发 INotify属性Changed 接口的 属性Changed 事件,当你说你理解 mvvm 模式时,你认为你知道这一点。
然后在 RibbonButton 的方法中,只需将 CurrentContent 属性 更改为不同的 ViewModel。
public void MyCommandMethod()
{
this.CurrentContent = new DifferentViewModel();
}
ViewModel 应该通过 DataTemplates 映射到视图,例如:
<DataTemplate DataType="{x:Type my:DifferentViewModel}">
<local:MyUserControlForDifferentView />
</DataTemplate>
编辑:
我在开始使用 wpf 时找到的最好的教程是 Josh Smith 的文章: this