WPF multifunzione, modificare il contenuto principale quando ribbontab è selezionata

StackOverflow https://stackoverflow.com/questions/1846647

  •  12-09-2019
  •  | 
  •  

Domanda

Vorrei cambiare il contenuto di superficie principale (la roba sotto il nastro stesso)in un'applicazione WPF quando una scheda della barra multifunzione viene cliccato.Sto utilizzando la barra multifunzione di office, non che importi molto.In modo che WPF controllo contenitore devo usare e come devo fare?Devo solo avere vari controlli con visibilità nascosto, o che cosa.Io non sono un WPF esperto quindi ho bisogno di un po ' di ispirazione.

È stato utile?

Soluzione

Ill prefazione dicendo che c'è dubbio che questo è il modo migliore per fare questo.

Questo è il mio stile, per RibbonTab avviso IsSelected è associato a IsSelected nel modello di vista

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

Questo è il codice del modello

    public bool IsSelected
    {
        get
        {
            return _isSelected;
        }

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

Il costruttore del TabViewModel prendo un parametro per il ViewModel del contenuto

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

    private ISelectedContentTab _selectedContent;

Poi ho usato un ItemsControl per visualizzare il contenuto selezionato nella mia xaml

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

E il ContentControlTemplate che ho è

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

Inoltre, assicurarsi che si dispone di un modello di dati puntando il contenuto di una vista

Spero che questo aiuta.

Altri suggerimenti

L'idea è di avere il contenuto di seguito nastro impilati in strati, (come in Photoshop o qualsiasi altro editor grafico) e mostrano solo strato avete bisogno di questo momento.Basta collegare Visibility del livello di IsSelected proprietà della scheda desiderata

MainGrid qui è un contenitore per i livelli (che sono le Griglie di troppo):

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

...e non hai bisogno di alcun codice a tutti!

P. S.Oh, ho dimenticato che devi dichiarare BooleanToVisibilityConverter in risorse del corso

Credo che ci sia un modo più semplice per farlo. L'ho fatto in questo modo:

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

E nel codice dietro:

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

So che questo è un thread vecchio, ma Ho avuto un problema con questo e non ho trovato alcun aiuto vb.net, ma ho scoperto una soluzione per conto mio ... ecco che è:

Dare il vostro RibbonTab un nome in modo da poter gestire nel codice dietro. So che ci sono diversi modi per aggiungere punti di vista e dei controlli, ma qui è quello che ho fatto ... Ho semplicemente aggiunto una nuova griglia per la mia vista all'interno della griglia principale dopo la barra multifunzione. vale a dire:

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

Quindi il codice dietro (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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top