fita WPF, alterar o conteúdo principal quando ribbontab é seleccionado
Pergunta
Gostaria de alterar o conteúdo da superfície principal (o material abaixo da própria fita) em um aplicativo WPF quando uma guia da faixa é clicado. Eu estou usando a fita de escritório, não que é coisas muito. Assim que o controle recipiente WPF que eu deveria usar, e como eu faria isso? Devo apenas ter vários controles com visibilidade oculta, ou o quê. Eu não sou um especialista em WPF então eu preciso de um pouco de inspiração.
Solução
Ill prefácio, dizendo que eu duvido que esta é a melhor maneira de fazer isso.
Este é o meu estilo para RibbonTab aviso IsSelected é obrigado a IsSelected no modelo de vista ??p>
<!-- 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>
Este é o código vista do modelo
public bool IsSelected
{
get
{
return _isSelected;
}
set
{
if (_isSelected != value)
{
_isSelected = value;
OnPropertyChanged(new PropertyChangedEventArgs("IsSelected"));
}
}
}
private bool _isSelected;
No construtor para o TabViewModel eu tomar um parâmetro para o ViewModel do conteúdo
public TabData(ISelectedContentTab content)
: this(content.DisplayName)
{
_selectedContent = content;
}
private ISelectedContentTab _selectedContent;
Então eu usei um ItemsControl para exibir o conteúdo selecionado no meu xaml
<ItemsControl Grid.Row="1" VerticalContentAlignment="Stretch" VerticalAlignment="Stretch"
ItemsSource="{Binding ElementName=ribbon,Path=SelectedItems}"
ItemTemplate="{StaticResource ContentControlTemplate}" />
E o ContentControlTemplate que eu tenho é
<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>
Também verifique se você tem um datatemplate apontando o seu conteúdo para uma visão
Espero que isso ajude.
Outras dicas
A idéia é ter conteúdo abaixo fita empilhados em camadas, (como no Photoshop ou qualquer outro editor gráfico) e mostrar apenas a camada que você precisa neste momento. Apenas Visibility
ligamento de sua camada de propriedade IsSelected
de guia desejada
MainGrid aqui é um recipiente para camadas (que são Grids também):
<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 você não precisa de qualquer código em tudo!
P.S. Oh, eu esqueço que você tem que BooleanToVisibilityConverter
declarar em recursos de curso
Eu acho que há uma maneira mais simples de fazê-lo. Eu fiz assim:
<Frame NavigationUIVisibility="Hidden" x:Name="FrmMainFrame" DockPanel.Dock="Bottom"/>
E em seu código por trá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/"));
}
Eu sei que esta é uma discussão mais velho, mas eu tenho tido um problema com isso e não encontrei nenhuma ajuda vb.net, mas eu descobri uma solução por conta própria ... então aqui está:
Dê seu RibbonTab um nome para que você pode lidar com isso no trás código. Eu sei que existem várias maneiras de adicionar pontos de vista e controles, mas aqui é o que eu fiz ... Eu simplesmente adicionou uma nova grelha para meu ponto de vista dentro da grade principal após a fita. ou seja:
<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>
Então o por trás de código (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