2009-12-04 25 views
8

Tôi muốn thay đổi nội dung của bề mặt chính (chính dưới chính ribbon) trong ứng dụng WPF khi nhấn vào tab ribbon. Tôi đang sử dụng ruy-băng văn phòng, điều đó không quan trọng lắm. Vì vậy, WPF container kiểm soát tôi nên sử dụng, và làm thế nào tôi sẽ làm điều đó? Tôi có nên có các điều khiển khác nhau với khả năng hiển thị ẩn hay không. Tôi không phải là một chuyên gia WPF vì vậy tôi cần một chút cảm hứng.Ribbon WPF, thay đổi nội dung chính khi ribbontab được chọn

+1

Tôi nghĩ theo ULA của Microsoft, bạn không thể sử dụng giao diện người dùng ribbon có thể thay đổi nội dung của khu vực bề mặt chính khi bạn thay đổi tab. Mỗi tab chỉ có các nút trên thanh công cụ và không thay đổi giao diện nội dung. –

+0

Tôi không chắc là bạn đúng. Hãy suy nghĩ về cách Word hoạt động, khi bạn thay đổi chế độ xem. –

+0

Klaus, bạn có thể vui lòng cung cấp thêm chi tiết về cách bạn giải quyết vấn đề này không? – l33t

Trả lời

11

Lời nói đầu của tôi bằng cách nói rằng tôi nghi ngờ đây là cách tốt nhất để thực hiện việc này.

Đây là phong cách của tôi cho RibbonTab nhận thấy IsSelected là ràng buộc để IsSelected trong Mô hình xem

<!-- 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> 

Đây là quan điểm mô hình mã

public bool IsSelected 
    { 
     get 
     { 
      return _isSelected; 
     } 

     set 
     { 
      if (_isSelected != value) 
      { 
       _isSelected = value; 
       OnPropertyChanged(new PropertyChangedEventArgs("IsSelected")); 
      } 
     } 
    } 
    private bool _isSelected; 

Trong constructor cho TabViewModel Tôi lấy một tham số cho ViewModel của nội dung

public TabData(ISelectedContentTab content) 
     : this(content.DisplayName) 
    { 
     _selectedContent = content; 
    } 

    private ISelectedContentTab _selectedContent; 

Sau đó, tôi đã sử dụng một ItemsCon trol để hiển thị các nội dung được lựa chọn trong XAML của tôi

<ItemsControl Grid.Row="1" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch" 
        ItemsSource="{Binding ElementName=ribbon,Path=SelectedItems}" 
        ItemTemplate="{StaticResource ContentControlTemplate}" /> 

Và ContentControlTemplate tôi có là

<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> 

Ngoài ra hãy chắc chắn rằng bạn có một datatemplate chỉ nội dung của bạn đến một cái nhìn

Hope this helps.

+1

Vui lòng cung cấp thêm chi tiết! Những đoạn mã này không đủ để làm cho ngày của tôi :) – l33t

1

Tôi biết đây là một chủ đề cũ hơn, nhưng tôi đã gặp vấn đề với điều này và không tìm thấy bất kỳ trợ giúp vb.net nào, nhưng tôi đã tự khám phá ra một giải pháp ...

Đặt tên RibbonTab của bạn để bạn có thể xử lý nó trong mã phía sau. Tôi biết có nhiều cách để thêm chế độ xem và điều khiển, nhưng dưới đây là những gì tôi đã làm ... Tôi chỉ cần thêm lưới mới cho chế độ xem của mình trong Lưới chính sau ruy-băng. ví dụ:

<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> 

Sau đó, các mã sau (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

Tôi đoán có một cách đơn giản hơn để làm điều đó. Tôi đã thực hiện nó như thế này:

<Frame NavigationUIVisibility="Hidden" x:Name="FrmMainFrame" DockPanel.Dock="Bottom"/> 

Và trong mã của bạn đằng sau:

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

Ý tưởng là để có nội dung dưới đây ruy băng xếp chồng lên nhau trong lớp, (như trong Photoshop hoặc bất kỳ trình soạn đồ họa khác) và chỉ hiển thị lớp bạn cần thời điểm này. Chỉ cần gắn Visibility của lớp của bạn để IsSelected tài sản của tab mong muốn

MainGrid đây là một container cho các lớp (trong đó có lưới quá):

<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> 

... và bạn không cần bất kỳ mã nào cả !

P.S.Ồ, tôi quên bạn phải khai báo BooleanToVisibilityConverter trong tài nguyên của khóa học

+0

Đơn giản nếu bạn không cần phải ràng buộc mọi thứ. Chỉ cần thêm vào tài nguyên. – dvdhns

Các vấn đề liên quan