当单击功能区选项卡时,我想在WPF应用程序中更改主表面的内容(功能区本身下方的内容)。我正在使用办公室功能区,这并不重要。那么我应该使用哪个WPF容器控件,我该如何做?我应该只是隐藏可见性或什么的各种控制。我不是WPF专家,所以我需要一点灵感。WPF功能区,当选择功能区选项卡时更改主要内容
回答
我的前言说我怀疑这是做这件事的最好方法。
这是我RibbonTab风格注意到IsSelected势必IsSelected在视图模型
<!-- RibbonTab -->
<Style TargetType="{x:Type ribbon:RibbonTab}">
<Setter Property="ContextualTabGroupHeader" Value="{Binding ContextualTabGroupHeader}" />
<Setter Property="Header" Value="{Binding Header}" />
<Setter Property="ItemsSource" Value="{Binding GroupDataCollection}" />
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>
这是视图模型代码
public bool IsSelected
{
get
{
return _isSelected;
}
set
{
if (_isSelected != value)
{
_isSelected = value;
OnPropertyChanged(new PropertyChangedEventArgs("IsSelected"));
}
}
}
private bool _isSelected;
在构造为我带一个参数为TabViewModel内容的ViewModel
public TabData(ISelectedContentTab content)
: this(content.DisplayName)
{
_selectedContent = content;
}
private ISelectedContentTab _selectedContent;
然后我用ItemsCon特伦在我的XAML
<ItemsControl Grid.Row="1" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch"
ItemsSource="{Binding ElementName=ribbon,Path=SelectedItems}"
ItemTemplate="{StaticResource ContentControlTemplate}" />
而且ContentControlTemplate我要显示所选择的内容是
<DataTemplate x:Key="ContentControlTemplate">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<ContentControl Grid.Row="0" VerticalAlignment="Stretch" Height="Auto" VerticalContentAlignment="Stretch" Content="{Binding SelectedContent}" />
</Grid>
</DataTemplate>
另外,还要确保你有你的内容指向一个视图
希望这有助于一个DataTemplate。
请提供更多详情!这些代码片段不足以让我的一天:) – l33t
我知道这是一个较老的线程,但我一直有这个问题,并没有找到任何vb.net的帮助,但我发现了一个解决方案,我自己...所以这里是这样的:
给你的RibbonTab一个名字,以便你可以在后面的代码中处理它。 我知道有多种方法来添加视图和控件,但这里是我所做的... 我只是在功能区之后的主Grid中为我的视图添加了一个新的网格。即:
<r:RibbonWindow>
<Grid>
<r:Ribbon>
<r:RibbonTab Name="Tab1" Header="Home">
<r:RibbonGroup Name="Group1">
<r:RibbonButton LargeImageSource="images\icon.png" Label="Click Me"/>
</r:RibbonGroup>
</r:RibbonTab>
<r:RibbonTab Name="Tab2" Header="Other Tab">
<r:RibbonGroup Name="Group2">
<r:RibbonButton LargeImageSource="images\icon.png" Label="Click Me"/>
</r:RibbonGroup>
</r:RibbonTab>
</r:Ribbon>
<Grid Name="Tab1RTB" Grid.Row="1" Visibility="Hidden">
<RichTextBox Margin="5" BorderBrush="LightGray" BorderThickness="1"/>
</Grid>
<Grid Name="Tab2RTB" Grid.Row="1" Visibility="Hidden">
<RichTextBox Margin="5" BorderBrush="LightGray" BorderThickness="1"/>
</Grid>
</Grid>
</r:RibbonWindow>
然后后面的代码(VB.NET)
Private Sub TabChanged(sender As System.Object, e As SelectionChangedEventArgs) Handles ribbonHome.SelectionChanged
If Tab1.IsSelected = True Then
Tab1RTB.Visibility = Windows.Visibility.Visible
Tab2RTB.Visibility = Windows.Visibility.Collapsed
ElseIf Tab2.IsSelected = True
Tab1RTB.Visibility = Windows.Visibility.Collapsed
Tab2RTB.Visibility = Windows.Visibility.Visible
Else
Tab1RTB.Visibility = Windows.Visibility.Collapsed
Tab2RTB.Visibility = Windows.Visibility.Collapsed
End If
End Sub
我想有一个更简单的方法来做到这一点。我已经做了这样的:
<Frame NavigationUIVisibility="Hidden" x:Name="FrmMainFrame" DockPanel.Dock="Bottom"/>
而且在后面的代码:
mainWindowView.RibMain.SelectionChanged += RibMain_SelectionChanged;
void RibMain_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
var tab = this.mainWindowView.RibMain.SelectedItem as RibbonTab;
if (tab.Header.Equals("Explorer"))
{
mainWindowView.FrmMainFrame.Navigate(explorerController.View());
}
else
mainWindowView.FrmMainFrame.NavigationService.Navigate(new Uri("http://www.google.com/"));
}
的想法是有以下色带堆积层内容(如在Photoshop或任何其他图形编辑器)和只显示你需要这一刻的图层。只要您绑定层的Visibility
所需标签的IsSelected
财产这里
MainGrid是层的容器(这是网格太):
<Grid x:Name="MainGrid">
<Grid Visibility="{Binding IsSelected, Converter={StaticResource BooleanToVisibilityConverter}, ElementName=ribbonTab2}">
<Image x:Name="ImgMain" Source="x.jpg"/>
</Grid>
<Grid Visibility="{Binding IsSelected, Converter={StaticResource BooleanToVisibilityConverter}, ElementName=ribbonTab1}">
<Image x:Name="ImgXtra" Source="y.jpg"/>
</Grid>
</Grid>
...你不需要任何代码!
P.S.哦,我忘了你必须在资源中声明BooleanToVisibilityConverter
当然
简单,如果你不需要绑定一切。只需要将
- 1. 选择功能区选项卡时更改ViewModel
- 2. 防止更改WPF功能区中选定的选项卡
- 3. 当选定的功能区选项卡项更改时更改视图
- 4. WPF功能区更改主题
- 5. 启用VSTO功能区选项卡
- 6. 在Outlook xml功能区选项卡中更改显示顺序
- 7. VSTO:更改现有的Word功能区选项卡
- 8. 如何选择Outlook 2010功能区上的选项卡
- 9. 功能区自动选择上下文选项卡
- 10. WPF功能区 - 选项卡标题区域中的停靠区域
- 11. 选择内容到功能
- 12. WPF功能区菜单选项卡永久可见
- 13. 防止WPF功能区选项卡折叠
- 14. WPF Ribbon控件 - 更改功能区按钮的内容
- 15. Excel加载项选项卡不显示在功能区上
- 16. 流利的功能区选项卡项目单击事件
- 17. 选项卡按钮功能
- 18. 在功能区加载功能区中更改按钮
- 19. 使用MVVM实现选项卡控制页面功能区选项卡
- 20. 功能区选项卡id名称不会更改为自定义名称c#
- 21. 更改.NET 4.5 WPF功能区的主题
- 22. 运行时将自定义功能区组添加到现有的OOB Sharepoint功能区选项卡
- 23. 的InstallShield:当功能选择
- 24. 如何限制访问DevExpress选项卡功能区?
- 25. Outlook 2007功能区中缺少添加选项卡
- 26. 字VBA宏切换功能区选项卡打开
- 27. 如何获取功能区自定义选项卡ID?
- 28. 刷新Sharepoint 2010功能区选项卡中的控件
- 29. 将选项卡添加到Outlook 2010功能区?
- 30. C#:Excel插件功能区选项卡不显示
我认为根据微软的ULA,当你改变标签时你不能使用可以改变主表面区域内容的Ribbon UI。每个选项卡只应具有工具栏按钮,并且不会更改内容的外观。 –
我不确定你是对的。思考Word如何改变视图模式。 –
克劳斯,你能提供关于你如何解决这个问题的更多细节吗? – l33t