2025-10-13

Formulários, dados e bindings

Classe dos dados

Necessário herdar a classe das notificações, e nas propriedades ao actualizar o valor chamamos a funcção que notifica a sua alteração

 

 Public Class ucJogoDados
    Inherits BaseNotifacao

    Private _CodJogo As Long
    Public Property CodJogo() As Long
        Get
            Return _CodJogo
        End Get
        Set(ByVal value As Long)
            _CodJogo = value
            Notifica("CodJogo")
        End Set
    End Property

... outras propriedades ...

End Classe

Na janela/formulário temos primeiro de adicionar a a classe dos dados

 

Public Class ucJogo

    Private JogoDados As ucJogoDados

    Sub New()
        ' This call is required by the designer.
        InitializeComponent()
        ' Add any initialization after the InitializeComponent() call.
        Me.DataContext = New ucJogoDados()
    End Sub

    Public Sub DadosActualizar(aux As ucJogoDados)
        JogoDados = aux
        Me.DataContext = JogoDados
    End Sub

End Class

No xaml criamos os bindings propriamente ditos

<Label x:Name="Equipa1" Content="{Binding Path=Equipa1}" 
       HorizontalContentAlignment="Left" VerticalContentAlignment="Center"
       HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
<TextBox x:Name="Golos1" Grid.Column="1" 
        HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
        HorizontalAlignment="Stretch" Text="{Binding Path=Golos1}" 
        VerticalAlignment="Stretch"/>


 

 

Notificação das alterações nas propriedades

Para os bindings funcionarem é necessário implementar o interface INotifyPropertyChanged e depois usar o evento para notificar as alterações.

Para não termos de fazer sempre o mesmo em todas as classes de dados podemos criar uma classe onde é implementado a notificação e depois herdar nas classes de dados. 

 

Imports System.ComponentModel

Public MustInherit Class BaseNotifacao
    Implements INotifyPropertyChanged

    Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

    Public Sub Notifica(sPropriedade As String)
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(sPropriedade))
    End Sub

End Class 

Exemplo de implementação 

Public Class ucJogoDados
    Inherits BaseNotifacao

    Private _CodJogo As Long
    Public Property CodJogo() As Long
        Get
            Return _CodJogo
        End Get
        Set(ByVal value As Long)
            _CodJogo = value
            Notifica("CodJogo")
        End Set
    End Property

End Class



2025-10-08

WPF - Ribbon

Aspecto geral

 

Antes demais é necessário adicionar ao projecto a referência da bilbioteca System.Windows.Controls.Ribbon (.dll).

Para se ficar com uma janela principal mais "bonita" é necessário substituir o tipo de janela, assim em vez de se usar <Window> que tem este aspecto


usamos o <RibbonWindow> que fica assim


 


Estrutura


Nome da aplicação

É definido na tag principal Ribbon

<Ribbon x:Name="Menu" Title="Nome da aplicação">


Botões de acesso rápido (do lado esquerdo do titulo)

São definidos dentro da tag Ribbon.QuickAccessToolBar. Podem ser adicionados quantos elementos se quiser: button, combobox, etc

<Ribbon.QuickAccessToolBar>
    <RibbonQuickAccessToolBar >
        <RibbonButton x:Name="QATButton1" 
                      SmallImageSource="/Imagens/Icons/action undo.ico" />
        <RibbonButton x:Name="QATButton2" 
                      SmallImageSource="Imagens/Icons/action redo.ico" />
    </RibbonQuickAccessToolBar>
</Ribbon.QuickAccessToolBar> 


Botão de ajuda (fica do lado direito)

Definido na tag Ribbon.HelpPaneContent

<Ribbon.HelpPaneContent>
    <RibbonButton SmallImageSource="Imagens/Icons/Help.ico" />
</Ribbon.HelpPaneContent> 

 

Menu principal da aplicação 

Menu que se abre no botão azul da esquerda

<Ribbon.ApplicationMenu>
    <RibbonApplicationMenu SmallImageSource="Imagens/Icons/settings 4.ico">
        <RibbonApplicationMenuItem Header="Olá"
                                   x:Name="MenuItem1"
                                   ImageSource="Imagens/Icons/Zoom.ico"/>
        <RibbonApplicationMenuItem Header="Sair"
                                   x:Name="MenuSair"
                                   ImageSource="Imagens/Icons/Power.ico"/>
    </RibbonApplicationMenu>
    <RibbonApplicationMenu.AuxiliaryPaneContent>
        <RibbonGallery ScrollViewer.VerticalScrollBarVisibility="Auto">
            <RibbonGalleryCategory MaxColumnCount="1">
                <RibbonGalleryItem
                                x:Name="GalleryItem1" Content="Esta é a parte da galeria" 
                                MouseOverBackground="Transparent"
                                MouseOverBorderBrush="Transparent"
                                CheckedBackground="Transparent"
                                CheckedBorderBrush="Transparent"/>
                <RibbonGalleryItem>
                    <Image Source="/Imagens/Icons/biohazard.ico" Width="50"/>
                </RibbonGalleryItem>
            </RibbonGalleryCategory>
        </RibbonGallery>
    </RibbonApplicationMenu.AuxiliaryPaneContent>
</Ribbon.ApplicationMenu> 

 

Os menus propriamente ditos.

São construidos com Tabulações, Grupos, elementos variáveis

<RibbonTab x:Name="HomeTab" 
           Header="Início">
    <RibbonGroup x:Name="Group1" 
                 Header="Groupo 1">
        <RibbonButton x:Name="Button1"
                      LargeImageSource="Imagens/Icons/Zoom.ico"
                      Label="Botão 1" />
        <RibbonButton x:Name="Button2"
                      SmallImageSource="Imagens/Icons/Zoom in 2.ico"
                      Label="Botão 2" />
        <RibbonButton x:Name="Button3"
                      SmallImageSource="Imagens/Icons/Zoom out 2.ico"
                      Label="Botão 3" />
        <RibbonButton x:Name="Button4"
                      SmallImageSource="Imagens/Icons/Toxic.ico"
                      Label="Botão 4" />
    </RibbonGroup>
</RibbonTab> 

 

 

Link da microsoft onde explicam mais em detalhe Ver

Para a classe Ribbon 

Formulários, dados e bindings

Classe dos dados Necessário herdar a classe das notificações, e nas propriedades ao actualizar o valor chamamos a funcção que notifica a sua...