WPF cinta de opciones, cambiar el contenido principal cuando ribbontab es seleccionado
Pregunta
Me gustaría cambiar el contenido de la superficie principal (el material por debajo de la cinta en sí)en una aplicación de WPF cuando una ficha de la cinta se hace clic.Estoy usando la cinta de opciones de office, no importa mucho.Así que WPF control de contenedor debo usar, y ¿cómo lo haría?Debo tener varios controles con visibilidad oculta, o qué.Yo no soy un WPF experto, así que necesito un poco de inspiración.
Solución
Enfermo prefacio diciendo me cabe duda de que esta es la mejor manera de hacer esto.
Esta es mi estilo para RibbonTab aviso IsSelected está obligado a IsSelected en El modelo de 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>
Esta es la vista de código de modelo
public bool IsSelected
{
get
{
return _isSelected;
}
set
{
if (_isSelected != value)
{
_isSelected = value;
OnPropertyChanged(new PropertyChangedEventArgs("IsSelected"));
}
}
}
private bool _isSelected;
En el constructor de la TabViewModel me tome un parámetro para la Perspective de los contenidos
public TabData(ISelectedContentTab content)
: this(content.DisplayName)
{
_selectedContent = content;
}
private ISelectedContentTab _selectedContent;
A continuación, he utilizado un ItemsControl para mostrar el contenido seleccionado en mi xaml
<ItemsControl Grid.Row="1" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch"
ItemsSource="{Binding ElementName=ribbon,Path=SelectedItems}"
ItemTemplate="{StaticResource ContentControlTemplate}" />
Y el ContentControlTemplate que tengo es
<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>
También asegúrese de que usted tiene un datatemplate señalando su contenido a una vista
Espero que esto ayude.
Otros consejos
La idea es tener un contenido por debajo de la cinta apiladas en capas, (como en Photoshop o cualquier otro editor gráfico) y sólo muestran la capa que necesita este momento. Sólo unirse Visibility
de la capa de IsSelected
propiedad de la ficha deseada
MainGrid aquí es un contenedor de capas (que son Grids también):
<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>
... y que no es necesario ningún código en absoluto!
P.S. Ah, se me olvida que tiene que declarar en BooleanToVisibilityConverter
recursos de curso
Creo que hay una manera más sencilla de hacerlo. Lo he hecho así:
<Frame NavigationUIVisibility="Hidden" x:Name="FrmMainFrame" DockPanel.Dock="Bottom"/>
Y en su código detrás:
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/"));
}
Sé que esto es un hilo viejo, pero he estado teniendo un problema con esto y no he encontrado ninguna ayuda vb.net, pero he descubierto una solución por mi cuenta ... así que aquí está:
Da tu RibbonTab un nombre para que pueda manejarlo en el código subyacente. Sé que hay varias formas de agregar puntos de vista y los controles, pero aquí es lo que hice ... Simplemente añadido una nueva rejilla para mi punto de vista dentro de la red principal después de la cinta. es decir:
<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>
A continuación, el código subyacente (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