2009-12-04 78 views
8

当单击功能区选项卡时,我想在WPF应用程序中更改主表面的内容(功能区本身下方的内容)。我正在使用办公室功能区,这并不重要。那么我应该使用哪个WPF容器控件,我该如何做?我应该只是隐藏可见性或什么的各种控制。我不是WPF专家,所以我需要一点灵感。WPF功能区,当选择功能区选项卡时更改主要内容

+1

我认为根据微软的ULA,当你改变标签时你不能使用可以改变主表面区域内容的Ribbon UI。每个选项卡只应具有工具栏按钮,并且不会更改内容的外观。 –

+0

我不确定你是对的。思考Word如何改变视图模式。 –

+0

克劳斯,你能提供关于你如何解决这个问题的更多细节吗? – l33t

回答

11

我的前言说我怀疑这是做这件事的最好方法。

这是我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。

+1

请提供更多详情!这些代码片段不足以让我的一天:) – l33t

1

我知道这是一个较老的线程,但我一直有这个问题,并没有找到任何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 
2

我想有一个更简单的方法来做到这一点。我已经做了这样的:

<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/")); 
    } 
7

的想法是有以下色带堆积层内容(如在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当然

+0

简单,如果你不需要绑定一切。只需要将添加到资源。 – dvdhns

相关问题