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.

Foi útil?

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

  <!-- 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top