WPF multifunzione, modificare il contenuto principale quando ribbontab è selezionata
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.
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