WPF cinta de opciones, cambiar el contenido principal cuando ribbontab es seleccionado

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

  •  12-09-2019
  •  | 
  •  

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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top