Documentação Do Windows Forms
Documentação Do Windows Forms
h NOVIDADES
Novidades
e VISÃO GERAL
g TUTORIAL
a BAIXAR
Controles
e VISÃO GERAL
Sobre controles
p CONCEITO
Layout
c GUIA DE INSTRUÇÕES
Adiciona um controle
e VISÃO GERAL
Sobre o teclado
p CONCEITO
Eventos de teclado
c GUIA DE INSTRUÇÕES
Modificar eventos-chave
e VISÃO GERAL
Sobre o mouse
p CONCEITO
Eventos de mouse
Arrastar e soltar
c GUIA DE INSTRUÇÕES
Gerenciar o cursor
This article describes some of the new Windows Forms features and enhancements in
.NET 7.
There are a few breaking changes you should be aware of when migrating from .NET
Framework to .NET 7. For more information, see Breaking changes in Windows Forms.
Correctly scale nested controls. For example, a button that's in a panel, which is
placed on a tab page.
In .NET 7, this feature is disabled by default and you must opt in to receive this
change. Starting with .NET 8, this feature is enabled by default and you need to opt
out of it to revert to the previous behavior.
JSON
{
"runtimeOptions": {
"tfm": "net7.0",
"frameworks": [
...
],
"configProperties": {
"System.Windows.Forms.ScaleTopLevelFormMinMaxSizeForDpi": true,
}
}
}
Assistive tools now accurately draw focus indicators and report correct bounding
rectangles for nested forms and some elements of composite controls, such as
DataGridView, ListView, and TabControl.
The new data binding features allow you to fully embrace the MVVM pattern and the
use of object-relational mappers from ViewModels in Windows Forms easier than
before. This, in turn, makes it possible to reduce code in the code-behind files, and
opens new testing possibilities. More importantly, it enables code sharing between
Windows Forms and other .NET GUI frameworks such as WPF, UWP/WinUI, and MAUI.
And to clarify a commonly asked question, there aren't any plans to introduce XAML in
Windows Forms.
These new data binding features are in preview for .NET 7, and more work on this
feature will happen in .NET 8.
To enable the new binding, add the EnablePreviewFeatures setting to your project file.
This is supported in both C# and Visual Basic.
XML
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>
</Project>
The following code snippet demonstrates the new properties, events, and methods
added to the various classes in Windows Forms. Even though the following code
example is in C#, it also applies to Visual Basic.
C#
[RequiresPreviewFeaturesAttribute]
public abstract class BindableComponent : Component, IBindableComponent,
IComponent, IDisposable {
protected BindableComponent();
public BindingContext? BindingContext { get; set; }
public ControlBindingsCollection DataBindings { get; }
public event EventHandler BindingContextChanged;
protected virtual void OnBindingContextChanged(EventArgs e);
}
Miscellaneous improvements
Here are some other notable changes:
See also
.NET Blog - What's new in Windows Forms in .NET 7
Breaking changes in Windows Forms
Tutorial: Create a new WinForms app
How to migrate a Windows Forms desktop app to .NET 5
Novidades do .NET 6 (Windows Forms
.NET)
Artigo • 14/02/2023 • 5 minutos para o fim da leitura
Este artigo descreve alguns dos novos recursos e aprimoramentos do Windows Forms no
.NET 6.
Há algumas alterações interruptivas que você deve estar ciente ao migrar do .NET
Framework para o .NET 6. Para obter mais informações, consulte Alterações interruptivas
no Windows Forms.
Um recurso dos novos modelos C# que não foram levados adiante com Windows Forms
são as instruções de nível superior. O aplicativo de Windows Forms típico requer o
[STAThread] atributo e consiste em vários tipos divididos em vários arquivos, como os
arquivos de código do designer, portanto, o uso de instruções de nível superior não faz
sentido.
C#
class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
No .NET 6, esses modelos foram modificados para usar o novo código de inicialização,
invocado pelo ApplicationConfiguration.Initialize método .
C#
class Program
{
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
C#
O novo código de inicialização é usado pelo Visual Studio para configurar o Windows
Forms Visual Designer. Se você recusar o uso do novo código de inicialização,
restaurando o código antigo e ignorando o ApplicationConfiguration.Initialize
método , o Windows Forms Visual Designer não respeitará as configurações de
inicialização definidas.
XML
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<ApplicationVisualStyles>true</ApplicationVisualStyles>
<ApplicationUseCompatibleTextRendering>false</ApplicationUseCompatibleTextRen
dering>
<ApplicationHighDpiMode>SystemAware</ApplicationHighDpiMode>
<ApplicationDefaultFont>Microsoft Sans Serif,
8.25pt</ApplicationDefaultFont>
</PropertyGroup>
</Project>
O Windows Forms Visual Designer usa essas configurações. Para obter mais informações,
consulte a seção Aprimoramentos do designer do Visual Studio.
) Importante
XML
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<ApplicationDefaultFont>Microsoft Sans Serif,
8.25pt</ApplicationDefaultFont>
</PropertyGroup>
</Project>
- ou -
C#
class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.SetDefaultFont(new Font(new FontFamily("Microsoft
Sans Serif"), 8.25f));
Application.Run(new Form1());
}
}
System.ComponentModel.Design.ComponentDesigner
System.Windows.Forms.Design.ButtonBaseDesigner
System.Windows.Forms.Design.ComboBoxDesigner
System.Windows.Forms.Design.ControlDesigner
System.Windows.Forms.Design.DocumentDesigner
System.Windows.Forms.Design.DocumentDesigner
System.Windows.Forms.Design.FormDocumentDesigner
System.Windows.Forms.Design.GroupBoxDesigner
System.Windows.Forms.Design.LabelDesigner
System.Windows.Forms.Design.ListBoxDesigner
System.Windows.Forms.Design.ListViewDesigner
System.Windows.Forms.Design.MaskedTextBoxDesigner
System.Windows.Forms.Design.PanelDesigner
System.Windows.Forms.Design.ParentControlDesigner
System.Windows.Forms.Design.ParentControlDesigner
System.Windows.Forms.Design.PictureBoxDesigner
System.Windows.Forms.Design.RadioButtonDesigner
System.Windows.Forms.Design.RichTextBoxDesigner
System.Windows.Forms.Design.ScrollableControlDesigner
System.Windows.Forms.Design.ScrollableControlDesigner
System.Windows.Forms.Design.TextBoxBaseDesigner
System.Windows.Forms.Design.TextBoxDesigner
System.Windows.Forms.Design.ToolStripDesigner
System.Windows.Forms.Design.ToolStripDropDownDesigner
System.Windows.Forms.Design.ToolStripItemDesigner
System.Windows.Forms.Design.ToolStripMenuItemDesigner
System.Windows.Forms.Design.TreeViewDesigner
System.Windows.Forms.Design.UpDownBaseDesigner
System.Windows.Forms.Design.UserControlDocumentDesigner
APIs atualizadas
System.Windows.Forms.Control.Invoke agora aceita System.Action e
System.Func<TResult> como parâmetros de entrada.
Continue
Acessibilidade aprimorada
Os padrões de Automação da Interface do Usuário da Microsoft funcionam melhor com
ferramentas de acessibilidade, como Narrador e Jaws.
Confira também
Alterações interruptivas no Windows Forms
Tutorial: Criar um aplicativo WinForms
Como migrar um aplicativo da área de trabalho do Windows Forms para o .NET 5
o que há de novo no .net 5 (Windows
Forms .net)
Artigo • 08/02/2023 • 2 minutos para o fim da leitura
há algumas alterações significativas que você deve estar atento ao migrar do .NET
Framework para o .net 5. para obter mais informações, consulte alterações significativas
em Windows Forms.
Recursos avançados
Os padrões de automação da interface do usuário da Microsoft funcionam melhor
com ferramentas de acessibilidade como Narrator e Jaws.
Melhor desempenho.
U Cuidado
Novos controles
os seguintes controles foram adicionados desde que Windows Forms foi transportado
para .NET Framework:
System.Windows.Forms.TaskDialog
Um diálogo de tarefa é uma caixa de diálogo que pode ser usada para exibir
informações e receber a entrada simples do usuário. Como uma caixa de
mensagem, ela é formatada pelo sistema operacional de acordo com os
parâmetros definidos. A caixa de diálogo de tarefa tem mais recursos do que uma
mensagem. Para obter mais informações, consulte o exemplo da caixa de diálogo
tarefa .
Microsoft.Web.WebView2.WinForms.WebView2
Controles aprimorados
System.Windows.Forms.ListView
Dá suporte a grupos recolhíveis
Rodapés
Subtítulo de grupo, tarefa e imagens de título
System.Windows.Forms.FolderBrowserDialog
esta caixa de diálogo foi atualizada para usar a experiência de Windows moderna
em vez da experiência antiga Windows 7.
System.Windows.Forms.FileDialog
System.Windows.Forms.TextRenderer
Confira também
alterações recentes no Windows Forms
Tutorial: criar um novo aplicativo winforms (Windows Forms .net)
como migrar um aplicativo de área de trabalho Windows Forms para o .net 5
Guia da área de trabalho (Windows
Forms .NET)
Artigo • 15/02/2023 • 6 minutos para o fim da leitura
) Importante
A versão mais recente do Windows Forms é para .NET 6 usando o Visual Studio
2022 versão 17.0.
Este Guia da Área de Trabalho é escrito para Windows Forms no .NET 5 e versões
posteriores. Para obter mais informações sobre a versão do .NET Framework do
Windows Forms, confira Windows Forms para .NET Framework.
Introdução
O Windows Forms é uma estrutura de interface do usuário para a criação de aplicativos
da área de trabalho do Windows. Ele fornece uma das maneiras mais produtivas de criar
aplicativos da área de trabalho com base no designer visual fornecido no Visual Studio.
A funcionalidade, como o posicionamento de arrastar e soltar de controles visuais,
facilita a criação de aplicativos da área de trabalho.
Com o Windows Forms, você desenvolve aplicativos graficamente avançados que são
fáceis de implantar, atualizar e trabalhar enquanto estão offline ou enquanto estão
conectados à Internet. Os aplicativos do Windows Forms podem acessar o hardware
local e o sistema de arquivos do computador em que o aplicativo está em execução.
Para saber como criar um aplicativo do Windows Forms, confira Tutorial: Criar um
aplicativo WinForms.
nos Windows Forms, um formulário é uma superfície visual na qual são exibidas
informações para o usuário. Normalmente, você cria aplicativos do Windows Forms
adicionando controles a formulários e desenvolvendo respostas a ações do usuário,
como cliques do mouse ou pressionamentos de teclas. Um controle é um elemento de
interface do usuário discreto que exibe dados ou aceita a entrada de dados.
Por fim, se você precisar criar seus próprios elementos de interface do usuário
personalizados, o namespace System.Drawing conterá uma grande seleção de classes
para renderizar linhas, círculos e outras formas diretamente em um formulário.
Você pode criar controles associados a dados facilmente usando a janela Fontes de
Dados no Visual Studio. A janela exibe fontes de dados, como bancos de dados, serviços
Web e objetos em seu projeto. Você pode criar controles de associação de dados ao
arrastar itens dessa janela para os formulários do seu projeto. Você também pode
associar controles existentes a dados ao arrastar objetos da janela Fontes de Dados para
eles.
Outro tipo de vinculação de dados que você pode gerenciar nos Windows Forms é
chamado de configurações. A maioria dos aplicativos deve reter algumas informações
sobre seu estado de tempo de execução, como o último tamanho conhecido dos
formulários, e reter dados de preferência do usuário, como locais padrão para arquivos
salvos. O recurso de configuração de aplicativo lida com esses requisitos ao oferecer
uma forma fácil de armazenar ambos os tipos de configuração no computador cliente.
Depois de definir essas configurações usando o Visual Studio ou um editor de código,
as configurações são mantidas como XML e automaticamente lidas novamente na
memória em tempo de execução.
Ao atualizar seu aplicativo, você publica um novo manifesto de implantação e uma nova
cópia do aplicativo no servidor Web. O ClickOnce detectará que há uma atualização
disponível e atualizará a instalação do usuário. Nenhuma programação personalizada é
necessária para atualizar aplicativos antigos.
Confira também
Tutorial: Criar um aplicativo WinForms
Como adicionar um formulário a um projeto
Adiciona um controle
Tutorial: Criar um aplicativo Windows
Forms com o .NET
Artigo • 09/02/2023 • 5 minutos para o fim da leitura
Neste breve tutorial, você aprenderá a criar um novo aplicativo Windows Forms com o
Visual Studio. Depois que o aplicativo inicial for gerado, você aprenderá a adicionar
controles e como lidar com eventos. Ao final deste tutorial, você terá um aplicativo
simples que adiciona nomes a uma caixa de listagem.
) Importante
Pré-requisitos
Visual Studio 2022 versão 17.4 ou versões posteriores
Selecione a carga de trabalho de desenvolvimento da área de trabalho do .NET
Selecione o componente individual do .NET 7
Dica
) Importante
Você também pode salvar seu projeto em uma pasta diferente ajustando o
caminho local .
7. Por fim, na janela Informações adicionais , selecione .NET 7.0 (Suporte a Termos
Padrão) para a configuração da Estrutura e clique em Criar.
Depois que o aplicativo for gerado, o Visual Studio deverá abrir o painel de designer
para o formulário padrão, Form1. Se o designer de formulários não estiver visível, clique
duas vezes no formulário no painel Gerenciador de Soluções para abrir a janela do
designer.
2. Propriedades
Este painel mostra as configurações de propriedade que você pode definir com
base no item selecionado. Por exemplo, se você selecionar um item de
Gerenciador de Soluções, verá as configurações de propriedade relacionadas ao
arquivo. Se você selecionar um objeto no Designer, verá as configurações do
controle ou formulário.
3. Designer de Formulários
4. Caixa de Ferramentas
Dica
Se a caixa de ferramentas não estiver visível, você poderá exibi-la por meio do item
de menu Exibir>Caixa de Ferramentas .
Rotular
Botão
Listbox
Caixa de texto
Texto Names
Location 12, 27
Tamanho 120, 94
Location 138, 26
Tamanho 100, 23
Location 138, 55
Tamanho 100, 23
Tratar eventos
Agora que o formulário tem todos os seus controles dispostos, você precisa lidar com
os eventos dos controles para responder à entrada do usuário. Com o designer de
formulário ainda aberto, execute as seguintes etapas:
1. Selecione o controle de botão no formulário.
3. Localize o evento Clique e clique duas vezes nele para gerar um manipulador de
eventos.
C#
C#
Executar o aplicativo
Agora que o evento foi codificado, você pode executar o aplicativo pressionando a tecla
F5 ou selecionando Depurar>Iniciar Depuração no menu. O formulário é exibido e
você pode inserir um nome na caixa de texto e adicioná-lo clicando no botão.
Próximas etapas
Saiba mais sobre Windows Forms
Como migrar um aplicativo da área de
trabalho do Windows Forms para o .NET
5
Artigo • 16/03/2023 • 10 minutos para o fim da leitura
Este artigo descreve como migrar um aplicativo da área de trabalho do Windows Forms
do .NET Framework para o .NET 5 ou posterior. O SDK do .NET Core 3.0 inclui suporte
para aplicativos do Windows Forms. O Windows Forms ainda é uma estrutura somente
do Windows e só é executado nessa plataforma.
Migrar seu aplicativo do .NET Framework para o .NET 5 geralmente requer um novo
arquivo de projeto. O .NET 5 usa arquivos de projeto no estilo SDK, enquanto o .NET
Framework normalmente usa o arquivo de projeto mais antigo do Visual Studio. Se você
já abriu um arquivo de projeto do Visual Studio em um editor de texto, sabe o quão
detalhado ele é. Os projetos no estilo SDK são menores e não exigem tantas entradas
quanto o formato de arquivo de projeto mais antigo.
Para obter mais informações, confira Atualizar um aplicativo WPF para o .NET 5 com o
Assistente de Atualização do .NET.
Pré-requisitos
Visual Studio 2019 versão 16.11 ou posterior.
Considerações
Ao portar um aplicativo do Windows Forms do .NET Framework, há alguns pontos a
serem considerados.
Quando o .NET Core 3.0 foi lançado, o Windows Forms passou a ser um código
aberto no GitHub . O código para o Windows Forms para .NET 5 é uma
bifurcação do código base do Windows Forms do .NET Framework. É possível que
existam algumas diferenças e seu aplicativo será difícil de migrar.
É sempre uma boa prática usar as versões mais recentes dos pacotes do NuGet
antes de qualquer migração. Se seu aplicativo faz referência a pacotes do NuGet,
atualize-os para a versão mais recente. Certifique-se de que seu aplicativo foi
compilado com êxito. Após a atualização, se houver erros de pacote, faça
downgrade do pacote para a versão mais recente que não interrompa seu código.
Fazer backup dos seus projetos
A primeira etapa para migrar um projeto é fazer backup do projeto! Se algo der errado,
você poderá restaurar seu código ao estado original restaurando seu backup. Não
confie em ferramentas como o Analisador de Portabilidade do .NET para fazer backup
do projeto, mesmo que pareçam seguros. É melhor criar pessoalmente uma cópia do
projeto original.
Pacotes NuGet
Se o projeto estiver fazendo referência a pacotes NuGet, você provavelmente terá um
arquivo packages.config na pasta do projeto. Com projetos no estilo SDK, as referências
do pacote NuGet são configuradas no arquivo de projeto. Os arquivos de projeto do
Visual Studio também podem definir pacotes NuGet no arquivo de projeto. O .NET 5
não usa packages.config para pacotes NuGet. As referências do pacote NuGet devem
ser migradas para o arquivo de projeto antes da migração.
Arquivo de projeto
A próxima etapa na migração do aplicativo é converter o arquivo de projeto. Conforme
indicado anteriormente, o .NET 5 usa arquivos de projeto no estilo SDK e não carregará
os arquivos de projeto do Visual Studio usados pelo .NET Framework. No entanto, há a
possibilidade de você já estar usando projetos no estilo SDK. Você pode detectar
facilmente a diferença no Visual Studio. Clique com o botão direito do mouse no
arquivo de projeto no Gerenciador de Soluções e procure a opção de menu Editar
Arquivo de Projeto. Se esse item de menu estiver ausente, você estará usando o
formato de projeto antigo do Visual Studio e precisará atualizar.
Converta cada projeto em sua solução. Se você estiver usando o aplicativo de exemplo
referenciado anteriormente, os projetos MatchingGame e MatchingGame.Logic serão
convertidos.
Para converter um projeto, execute as seguintes etapas:
4. Copie e cole o XML do projeto em um editor de texto. Você desejará uma cópia
para que seja fácil mover o conteúdo para o novo projeto.
XML
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net5.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
</Project>
) Importante
Esse XML fornece a estrutura básica do projeto. No entanto, ele não contém nenhuma
das configurações do arquivo de projeto antigo. Usando as informações antigas do
projeto copiadas anteriormente para um editor de texto, execute as seguintes etapas:
<RootNamespace>
<AssemblyName>
XML
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net5.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<RootNamespace>MatchingGame</RootNamespace>
<AssemblyName>MatchingGame</AssemblyName>
</PropertyGroup>
</Project>
fechamento </PropertyGroup> .
XML
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
(contains settings previously described)
</PropertyGroup>
<ItemGroup>
<ProjectReference
Include="..\MatchingGame.Logic\MatchingGame.Logic.csproj">
<Project>{36b3e6e2-a9ae-4924-89ae-7f0120ce08bd}</Project>
<Name>MatchingGame.Logic</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="MetroFramework">
<Version>1.2.0.3</Version>
</PackageReference>
</ItemGroup>
</Project>
XML
<ItemGroup>
<ProjectReference
Include="..\MatchingGame.Logic\MatchingGame.Logic.csproj" />
</ItemGroup>
Recursos e configurações
Algo a observar sobre a diferença entre projetos do .NET Framework e os projetos no
estilo SDK usados pelo .NET 5 é que os projetos do .NET Framework usam um modelo
de aceitação para arquivos de código. Qualquer arquivo de código que você deseja
compilar precisa ser definido explicitamente em seu arquivo de projeto. Os projetos no
estilo SDK são o inverso, são padrão para recusar o comportamento: todos os arquivos
de código que começam no diretório do projeto e abaixo são incluídos
automaticamente em seu projeto. Você não precisará migrar essas entradas se elas
forem simples e sem configurações. Isso é o mesmo para outros arquivos comuns,
como resx.
Os projetos do Windows Forms também podem fazer referência aos seguintes arquivos:
Properties\Settings.settings
Properties\Resources.resx
Properties\app.manifest
XML
<ItemGroup>
<None Update="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Update="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
) Importante
XML
<ItemGroup>
<EmbeddedResource Update="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<Compile Update="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
</ItemGroup>
) Importante
Visual Basic
Os projetos da linguagem Visual Basic exigem uma configuração extra.
XML
<ItemGroup>
<None Include="My Project\Application.myapp">
<Generator>MyApplicationCodeGenerator</Generator>
<LastGenOutput>Application.Designer.vb</LastGenOutput>
</None>
<Compile Update="My Project\Application.Designer.vb">
<AutoGen>True</AutoGen>
<DependentUpon>Application.myapp</DependentUpon>
<DesignTime>True</DesignTime>
</Compile>
</ItemGroup>
XML
<PropertyGroup>
(contains settings previously described)
<MyType>WindowsForms</MyType>
</PropertyGroup>
XML
<ItemGroup>
<Import Include="Microsoft.VisualBasic" />
<Import Include="System" />
<Import Include="System.Collections" />
<Import Include="System.Collections.Generic" />
<Import Include="System.Data" />
<Import Include="System.Drawing" />
<Import Include="System.Diagnostics" />
<Import Include="System.Windows.Forms" />
<Import Include="System.Linq" />
<Import Include="System.Xml.Linq" />
<Import Include="System.Threading.Tasks" />
</ItemGroup>
Se você não encontrar nenhuma instrução <Import> ou se o projeto não for
compilado, verifique se você pelo menos tem as seguintes instruções <Import>
definidas em seu projeto:
XML
<ItemGroup>
<Import Include="System.Data" />
<Import Include="System.Drawing" />
<Import Include="System.Windows.Forms" />
</ItemGroup>
XML
<PropertyGroup>
(contains settings previously described)
<OptionExplicit>On</OptionExplicit>
<OptionCompare>Binary</OptionCompare>
<OptionStrict>Off</OptionStrict>
<OptionInfer>On</OptionInfer>
<StartupObject>MatchingGame.My.MyApplication</StartupObject>
</PropertyGroup>
Recarregar o projeto
Depois de converter um projeto no novo formato estilo SDK, recarregue o projeto no
Visual Studio:
Se o projeto não for carregado, talvez você tenha introduzido um erro no XML do
projeto. Abra o arquivo de projeto para edição e tente identificar e corrigir o erro.
Se você não encontrar um erro, tente recomeçar.
Editar App.config
Se seu aplicativo tiver um arquivo App.config, remova o elemento <supportedRuntime> :
XML
Há algumas coisas que você deve considerar com o arquivo App.config. O arquivo
App.config no .NET Framework foi usado não apenas para configurar o aplicativo, mas
para definir configurações e comportamento de runtime, como registro em log. O
arquivo App.config no .NET 5+ (e no .NET Core) não é mais usado para configuração de
runtime. Se o arquivo App.config tiver essas seções, elas não serão respeitadas.
XML
<ItemGroup>
<PackageReference Include="Microsoft.Windows.Compatibility"
Version="5.0.0" />
</ItemGroup>
Próximas etapas
Experimente o Assistente de Atualização do .NET para migrar seu aplicativo.
Saiba mais sobre alterações interruptivas do Windows Forms.
Leia mais sobre o Pacote de Compatibilidade do Windows.
Visão geral de eventos (Windows Forms
.NET)
Artigo • 09/02/2023 • 3 minutos para o fim da leitura
) Importante
Os tipos de eventos gerados por um objeto variam, mas muitos tipos são comuns à
maioria dos controles. Por exemplo, a maioria dos objetos lidará com um evento Click.
Se um usuário clicar em um formulário, o código no manipulador de eventos Click do
formulário é executado.
7 Observação
Muitos eventos ocorrem com outros eventos. Por exemplo, enquanto o evento
DoubleClick ocorre, os eventos MouseDown, MouseUp e Click ocorrem.
Para obter informações sobre como gerar e consumir um evento, consulte Manipulando
e gerando eventos.
Esse modelo de evento usa delegados para associar eventos aos métodos usados para
tratá-los. A classe delegate permite que outras classes se registrem para a notificação de
eventos, especificando um método de manipulador. Quando o evento ocorre, a classe
delegate chama o método associado. Para obter mais informações sobre como definir
delegados, consulte Manipulando e gerando eventos.
Essas classes podem ser associadas a um único método ou a vários métodos, o que
chamamos de multicasting. Ao criar um delegado para um evento, você normalmente
cria um evento multicast. Uma exceção rara pode ser um evento que resulta em um
procedimento específico (como exibir uma caixa de diálogo) que não se repetiria
logicamente várias vezes por evento. Para obter informações sobre como criar um
delegado multicast, consulte Como combinar delegados (delegados multicast).
Um delegado multicast mantém uma lista de invocação dos métodos aos qual está
associado. Essa classe é compatível com um método Combine para adicionar um
método à lista de invocação e um método Remove para removê-lo.
Essas classes também permitem que vários eventos sejam associados ao mesmo
método, permitindo uma notificação muitos para um. Por exemplo, um evento de clique
de botão e um evento de clique de comando de menu podem invocar a mesma classe
delegate, que chama um único método para lidar com esses eventos separados da
mesma maneira.
Confira também
Manipulando e acionando eventos
Dimensionamento automático
(Windows Forms .NET)
Artigo • 10/02/2023 • 4 minutos para o fim da leitura
) Importante
Uma situação análoga ocorre quando um aplicativo é projetado para uma determinada
resolução de exibição. A resolução de exibição mais comum é de 96 pontos por
polegada (DPI), que é igual a 100% de escala de exibição, mas telas de resolução mais
alta com suporte a 125%, 150%, 200% (que respectivamente são iguais a 120, 144 e 192
DPI) e acima estão se tornando mais comuns. Sem ajustes, um aplicativo, especialmente
um baseado em gráficos, projetado para uma resolução, aparecerá muito grande ou
muito pequeno quando executado em outra resolução.
U Cuidado
Confira também
AutoScaleMode
Scale
PerformAutoScale
AutoScaleDimensions
Como adicionar um formulário a um
projeto (Windows Forms .NET)
Artigo • 09/02/2023 • 2 minutos para o fim da leitura
Adicione formulários ao seu projeto com o Visual Studio. Quando seu aplicativo tem
vários formulários, você pode escolher qual é o formulário de inicialização para seu
aplicativo e pode exibir vários formulários ao mesmo tempo.
) Importante
Os formulários são compostos por dois arquivos que compartilham o mesmo nome:
form2.cs (form2 sendo um exemplo de nome de arquivo) e form2. Designer.cs. Às vezes,
existe um arquivo de recurso, compartilhando o mesmo nome, form2.resx. No exemplo
anterior, form2 representa o nome do arquivo base. Você desejará copiar todos os
arquivos relacionados para a pasta do projeto.
Como alternativa, você pode usar o Visual Studio para importar um arquivo para seu
projeto. Quando você adiciona um arquivo existente ao seu projeto, o arquivo é
copiado para a mesma pasta que o projeto.
Confira também
Como posicionar e dimensionar um formulário (Windows Forms .NET)
Visão geral de eventos (Windows Forms .NET)
Posição e layout de controles (Windows Forms .NET)
Como posicionar e dimensionar um
formulário (Windows Forms .NET)
Artigo • 09/02/2023 • 4 minutos para o fim da leitura
) Importante
Redimensionar no código
Embora o designer defina o tamanho inicial de um formulário, você pode redimensioná-
lo por meio do código. Usar código para redimensionar um formulário é útil quando
algo sobre seu aplicativo determina que o tamanho padrão do formulário é insuficiente.
C#
private void button1_Click(object sender, EventArgs e) =>
Size = new Size(250, 200);
C#
Se o Size não for definido manualmente, o tamanho padrão do formulário será o que
ele foi definido durante o tempo de design.
O valor CenterParent só funciona com formulários que são um formulário filho MDI
(interface de documento múltiplo) ou um formulário normal exibido com o ShowDialog
método . CenterParent não tem nenhum efeito em um formulário normal que é exibido
com o Show método . Para centralizar um formulário ( form variável) para outro
formulário ( parentForm variável), use o seguinte código:
C#
form.StartPosition = FormStartPosition.Manual;
form.Location = new Point(parentForm.Width / 2 - form.Width / 2 +
parentForm.Location.X,
parentForm.Height / 2 - form.Height / 2 +
parentForm.Location.Y);
form.Show();
Posição com código
Embora o designer possa ser usado para definir o local inicial de um formulário, você
pode usar o código para alterar o modo de posição inicial ou definir o local
manualmente. Usar código para posicionar um formulário será útil se você precisar
posicionar e dimensionar manualmente um formulário em relação à tela ou a outros
formulários.
C#
C#
) Importante
Redimensionar no código
Embora o designer defina o tamanho inicial de um formulário, você pode redimensioná-
lo por meio do código. Usar código para redimensionar um formulário é útil quando
algo sobre seu aplicativo determina que o tamanho padrão do formulário é insuficiente.
C#
private void button1_Click(object sender, EventArgs e) =>
Size = new Size(250, 200);
C#
Se o Size não for definido manualmente, o tamanho padrão do formulário será o que
ele foi definido durante o tempo de design.
O valor CenterParent só funciona com formulários que são um formulário filho MDI
(interface de documento múltiplo) ou um formulário normal exibido com o ShowDialog
método . CenterParent não tem nenhum efeito em um formulário normal que é exibido
com o Show método . Para centralizar um formulário ( form variável) para outro
formulário ( parentForm variável), use o seguinte código:
C#
form.StartPosition = FormStartPosition.Manual;
form.Location = new Point(parentForm.Width / 2 - form.Width / 2 +
parentForm.Location.X,
parentForm.Height / 2 - form.Height / 2 +
parentForm.Location.Y);
form.Show();
Posição com código
Embora o designer possa ser usado para definir o local inicial de um formulário, você
pode usar o código para alterar o modo de posição inicial ou definir o local
manualmente. Usar código para posicionar um formulário será útil se você precisar
posicionar e dimensionar manualmente um formulário em relação à tela ou a outros
formulários.
C#
C#
) Importante
Adicionando controles
Os controles são adicionados por meio do Visual Studio Designer. Com o Designer, você
pode colocar, dimensionar, alinhar e mover controles. Como alternativa, os controles
podem ser adicionados por meio do código. Para obter mais informações, consulte
Adicionar um controle (Windows Forms).
Opções de layout
A posição em que um controle aparece em um pai é determinada pelo valor da Location
propriedade em relação à parte superior esquerda da superfície pai. A coordenada de
posição superior esquerda no pai é (x0,y0) . O tamanho do controle é determinado
pela Size propriedade e representa a largura e a altura do controle.
Para obter mais informações, consulte Posição e layout de controles e Como encaixar e
ancorar controles.
Eventos de controle
Os controles fornecem um conjunto de eventos comuns por meio da classe base:
Control. Nem todos os controles respondem a todos os eventos. Por exemplo, o Label
controle não responde à entrada do teclado, portanto, o Control.PreviewKeyDown
evento não é gerado. A maioria dos eventos compartilhados se enquadra nessas
categorias:
Eventos de mouse
Eventos de teclado
Eventos de propriedade alterados
Outros eventos
Para obter mais informações, consulte Controlar eventos e Como manipular um evento
de controle.
Controlar a acessibilidade
Windows Forms tem suporte de acessibilidade para leitores de tela e utilitários de
entrada de voz para comandos verbais. No entanto, você deve projetar sua interface do
usuário com acessibilidade em mente. Windows Forms controles expõem várias
propriedades para lidar com a acessibilidade. Para obter mais informações sobre essas
propriedades, consulte Fornecendo informações de acessibilidade para controles.
Confira também
Posição e layout de controles
Visão geral do controle de rótulo
Eventos de controle
Tipos de controles personalizados
Pintura e desenho em controles
Fornecendo informações de acessibilidade para controles
Posição e layout de controles (Windows
Forms .NET)
Artigo • 09/02/2023 • 12 minutos para o fim da leitura
) Importante
Dock
A Dock propriedade define qual borda do controle é alinhada ao lado correspondente
do pai e como o controle é redimensionado dentro do pai.
O Location do controle não pode ser definido manualmente, pois encaixar um controle
controla automaticamente sua posição.
Se o controle Z-order for invertido, o controle encaixado à esquerda agora terá mais
espaço inicial disponível. O controle usa toda a altura do contêiner. O controle
encaixado na parte superior tem menos espaço horizontal disponível para ele.
Âncora
Ancorar um controle permite que você vincule o controle a um ou mais lados do
contêiner pai. Conforme o contêiner muda de tamanho, qualquer controle filho manterá
sua distância para o lado ancorado.
Apenas alguns controles dão suporte à AutoSize propriedade . Além disso, alguns
controles que dão suporte à AutoSize propriedade também dão suporte à AutoSizeMode
propriedade .
Se um controle mudar de tamanho, o Quando o conteúdo de um controle faz com que ele
valor de sua Location propriedade cresça, o controle aumenta para a direita e para baixo.
sempre permanecerá constante. Controles não crescem para a esquerda.
Comportamento sempre Descrição
verdadeiro
Não há um tamanho mínimo Isso significa que, se um controle for definido para reduzir
definido por padrão. AutoSize e não tiver conteúdo, o valor de sua Size
propriedade será (0x,0y) . Nesse caso, o controle será
reduzido a um ponto e não ficará visível imediatamente.
Se um controle não implementar o Isso significa que a configuração AutoSize como true
GetPreferredSize método , o método não terá efeito.
retornará o GetPreferredSize último
valor atribuído à Size propriedade .
Propriedade AutoSizeMode
A AutoSizeMode propriedade fornece um controle mais refinado sobre o
comportamento padrão AutoSize . A propriedade AutoSizeMode especifica como um
controle dimensiona a si mesmo de acordo com seu conteúdo. O conteúdo, por
exemplo, pode ser o texto de um Button controle ou os controles filho de um contêiner.
AutoSizeMode.GrowAndShrink
AutoSizeMode.GrowOnly
O controle cresce tanto quanto necessário para abranger seu conteúdo, mas não
reduzirá menor que o valor especificado por sua Size propriedade.
Button ✔️ ✔️
CheckedListBox ✔️ ✔️
FlowLayoutPanel ✔️ ✔️
Form ✔️ ✔️
GroupBox ✔️ ✔️
Panel ✔️ ✔️
TableLayoutPanel ✔️ ✔️
CheckBox ✔️ ❌
DomainUpDown ✔️ ❌
Label ✔️ ❌
LinkLabel ✔️ ❌
MaskedTextBox ✔️ ❌
NumericUpDown ✔️ ❌
RadioButton ✔️ ❌
TextBox ✔️ ❌
TrackBar ✔️ ❌
CheckedListBox ❌ ❌
Control AutoSize Suportado AutoSizeMode Suportado
ComboBox ❌ ❌
DataGridView ❌ ❌
DateTimePicker ❌ ❌
ListBox ❌ ❌
ListView ❌ ❌
MaskedTextBox ❌ ❌
MonthCalendar ❌ ❌
ProgressBar ❌ ❌
PropertyGrid ❌ ❌
RichTextBox ❌ ❌
SplitContainer ❌ ❌
TabControl ❌ ❌
TabPage ❌ ❌
TreeView ❌ ❌
WebBrowser ❌ ❌
ScrollBar ❌ ❌
- TextBox
- MaskedTextBox
- RichTextBox
- TrackBar
7 Observação
Contêiner: Formulário
O Form é o objeto principal do Windows Forms. Um aplicativo Windows Forms
geralmente terá um formulário exibido o tempo todo. Os formulários contêm controles
e respeitam as Location propriedades e Size do controle para posicionamento manual.
Os formulários também respondem à propriedade Dock para posicionamento
automático.
Na maioria das vezes, um formulário terá alças nas bordas que permitem ao usuário
redimensionar o formulário. A Anchor propriedade de um controle permitirá que o
controle cresça e diminua à medida que o formulário for redimensionado.
Contêiner: Painel
O Panel controle é semelhante a um formulário em que simplesmente agrupa controles.
Ele dá suporte aos mesmos estilos de posicionamento manual e automático que um
formulário. Para obter mais informações, consulte a seção Contêiner: Formulário .
Ao contrário do controle de caixa de grupo , um painel não tem uma legenda e uma
borda.
Você também pode controlar a direção da expansão (horizontal ou vertical) depois que
o TableLayoutPanel controle estiver cheio de controles filho. Por padrão, o
TableLayoutPanel controle se expande para baixo adicionando linhas.
Você pode controlar o tamanho e o estilo das linhas e colunas usando as RowStyles
propriedades e ColumnStyles . É possível definir as propriedades de linhas ou colunas
individualmente.
A imagem acima tem um contêiner dividido para criar um painel esquerdo e direito. O
painel direito contém um segundo contêiner dividido com o Orientation definido como
Vertical. A BorderStyle propriedade é definida para demonstrar os limites de cada painel.
Label Windows Forms controles são usados para exibir texto que não pode ser editado
pelo usuário. Eles são usados para identificar objetos em um formulário e para fornecer
uma descrição do que um determinado controle representa ou faz. Por exemplo, você
pode usar rótulos para adicionar legendas descritivas em caixas de texto, caixas de
listagem, caixas de combinação e assim por diante. Também é possível escrever código
para alterar o texto exibido por um rótulo em resposta a eventos em tempo de
execução.
) Importante
Confira também
Usar um rótulo para concentrar um controle (Windows Forms .NET)
Como definir o texto exibido por um controle (Windows Forms .NET)
AutoScaleMode
Scale
PerformAutoScale
AutoScaleDimensions
Eventos de controle (Windows Forms
.NET)
Artigo • 10/02/2023 • 3 minutos para o fim da leitura
) Importante
Eventos comuns
Os controles fornecem um conjunto de eventos comuns por meio da classe base:
Control. Nem todos os controles respondem a todos os eventos. Por exemplo, o Label
controle não responde à entrada do teclado, portanto, o Control.PreviewKeyDown
evento não é gerado. A maioria dos eventos compartilhados se enquadra nessas
categorias:
Eventos de mouse
Eventos de teclado
Eventos de propriedade alterada
Outros eventos
Eventos de mouse
Considerando Windows Forms é uma tecnologia de interface do usuário, a entrada do
mouse é a principal maneira como os usuários interagem com um aplicativo Windows
Forms. Todos os controles fornecem eventos básicos relacionados ao mouse:
MouseClick
MouseDoubleClick
MouseDown
MouseEnter
MouseHover
MouseLeave
MouseMove
MouseUp
MouseWheel
Click
Eventos de teclado
Se o controle responder à entrada do usuário, como um TextBox controle ou Button , o
evento de entrada apropriado será gerado para o controle. O controle deve estar
focado para receber eventos de teclado. Alguns controles, como o Label controle , não
podem ser focados e não podem receber eventos de teclado. Veja a seguir uma lista de
eventos de teclado:
KeyDown
KeyPress
KeyUp
Aqui estão alguns dos eventos de alteração de propriedade comuns para um controle:
Evento Descrição
Para obter uma lista completa de eventos, consulte a seção Eventos da Classe de
Controle.
Outros eventos
Os controles também gerarão eventos com base no estado do controle ou em outras
interações com o controle. Por exemplo, o HelpRequested evento será gerado se o
controle tiver foco e o usuário pressionar a tecla F1 . Esse evento também será gerado
se o usuário pressionar o botão de Ajuda contextual em um formulário e pressionar o
cursor de ajuda no controle.
Para obter uma lista completa de eventos, consulte a seção Eventos da Classe de
Controle.
Confira também
Como manipular um evento
Visão geral de eventos
Usando eventos do mouse
Usando eventos de teclado
System.Windows.Forms.Control
System.Windows.Forms.Control.Click
System.Windows.Forms.Button
Tipos de controles personalizados
(Windows Forms .NET)
Artigo • 10/02/2023 • 5 minutos para o fim da leitura
Com Windows Forms, você pode desenvolver e implementar novos controles. Você
pode criar um novo controle de usuário, modificar controles existentes por meio de
herança e escrever um controle personalizado que faz sua própria pintura.
) Importante
Decidir qual tipo de controle criar pode ser confuso. Este artigo destaca as diferenças
entre os vários tipos de controles dos quais você pode herdar e fornece informações
sobre como escolher um tipo específico de controle para seu projeto.
Como grande parte da infraestrutura é fornecida pela classe base, é relativamente fácil
desenvolver seus próprios controles Windows Forms.
Controles de composição
Um controle de composição é uma coleção de controles dos Windows Forms
encapsulados em um contêiner comum. Esse tipo de controle é, às vezes, chamado de
controle de usuário. Os controles contidos são chamados controles constituintes.
Por exemplo, um controle de composição poderia ser criado para exibir dados de
endereço de cliente de um banco de dados. Esse controle incluiria um DataGridView
controle para exibir os campos de banco de dados, um BindingSource para manipular a
associação a uma fonte de dados e um BindingNavigator controle para percorrer os
registros. Você pode expor seletivamente propriedades de vinculação de dados, além de
poder empacotar e reutilizar todo o controle do aplicativo para o aplicativo.
Controles estendidos
Você pode derivar um controle herdado de qualquer controle Windows Forms existente.
Com essa abordagem, você pode manter toda a funcionalidade inerente de um controle
Windows Forms e, em seguida, estender essa funcionalidade adicionando propriedades
personalizadas, métodos ou outros recursos. Com essa opção, você pode substituir a
lógica de pintura do controle base e estender a interface do usuário alterando sua
aparência.
Por exemplo, você pode criar um controle derivado do Button controle que rastreia
quantas vezes um usuário clicou nele.
Controles personalizados
Outra maneira de criar um controle é criar um substancialmente desde o início
herdando de Control. A Control classe fornece toda a funcionalidade básica exigida
pelos controles, incluindo eventos de manipulação de mouse e teclado, mas nenhuma
funcionalidade específica do controle ou interface gráfica.
Criar um controle herdando da Control classe requer muito mais pensamento e esforço
do que herdar de UserControl ou de um controle Windows Forms existente. Como uma
grande quantidade de implementação é deixada para você, o controle pode ter maior
flexibilidade do que um controle de composição ou estendido e você pode personalizar
o controle para atender às suas necessidades.
Para implementar um controle personalizado, você deve escrever código para o OnPaint
evento do controle, bem como qualquer código específico do recurso necessário. Você
também pode substituir o método e manipular mensagens do WndProc Windows
diretamente. Essa é a maneira mais eficiente para criar um controle, mas, para usar essa
técnica com eficiência, você precisa estar familiarizado com a API do Win32® da
Microsoft.
Controles ActiveX
Embora a infraestrutura dos Windows Forms tenha sido otimizada para hospedar
controles dos Windows Forms, você ainda poderá usar controles ActiveX. Há suporte
para essa tarefa no Visual Studio.
Confira também
Visão geral do uso de controles (Windows Forms .NET)
Pintura e desenho em controles
(Windows Forms .NET)
Artigo • 11/02/2023 • 5 minutos para o fim da leitura
) Importante
Se você quiser fornecer renderização personalizada para um controle existente sem criar
um novo controle, suas opções se tornarão mais limitadas. No entanto, ainda há uma
ampla gama de possibilidades gráficas para seus controles e aplicativos.
OnPaint
Um controle deve fornecer lógica de renderização substituindo o OnPaint método
herdado de Control. OnPaint obtém acesso a um objeto gráfico e um retângulo para
desenhar por meio do Graphics e as ClipRectangle propriedades da PaintEventArgs
instância passadas para ele.
C#
// Declare and instantiate a new pen that will be disposed of at the end
of the method.
using var myPen = new Pen(Color.Aqua);
7 Observação
C#
SetStyle(ControlStyles.ResizeRedraw, true);
Onpaintbackground
A classe base Control define outro método útil para desenhar, o OnPaintBackground
método .
C#
Confira também
Tipos de controles personalizados
Fornecendo informações de
acessibilidade para controles (Windows
Forms .NET)
Artigo • 10/02/2023 • 2 minutos para o fim da leitura
System.Windows.Forms.AccessibleObject
System.Windows.Forms.Control.AccessibleDefaultActionDescription
System.Windows.Forms.Control.AccessibleDescription
System.Windows.Forms.Control.AccessibleName
System.Windows.Forms.AccessibleRole
) Importante
Propriedade AccessibilityObject
Essa propriedade somente leitura contém uma AccessibleObject instância. O
AccessibleObject implementa a IAccessible interface , que fornece informações sobre a
Propriedade
AccessibleDefaultActionDescription
Essa cadeia de caracteres descreve as ações do controle. Ela não aparece na janela
Propriedades e só pode ser definido no código. O exemplo a seguir define a
AccessibleDefaultActionDescription propriedade para um controle de botão:
C#
Propriedade AccessibleDescription
Essa cadeia de caracteres descreve o controle. A AccessibleDescription propriedade
pode ser definida no janela Propriedades ou no código da seguinte maneira:
C#
Propriedade AccessibleName
Esse é o nome de um controle relatado para os recursos de acessibilidade. A
AccessibleName propriedade pode ser definida no janela Propriedades ou no código da
seguinte maneira:
C#
button1.AccessibleName = "Order";
Propriedade AccessibleRole
Essa propriedade, que contém uma AccessibleRole enumeração, descreve a função de
interface do usuário do controle. Um novo controle tem o valor definido como Default .
Isso significaria que, por padrão, um Button controle atua como um Button . Pode ser
útil redefinir essa propriedade se um controle tiver outra função. Por exemplo, você
pode estar usando um PictureBox controle como um Chart e talvez queira que os
auxílios de acessibilidade relatem a função como um Chart , não como um PictureBox .
Também pode ser útil especificar essa propriedade para controles personalizados
desenvolvidos por você. Essa propriedade pode ser definida na janela Propriedades ou
no código da seguinte maneira:
C#
pictureBox1.AccessibleRole = AccessibleRole.Chart;
Confira também
Visão geral do controle de rótulo (Windows Forms .NET)
AccessibleObject
Control.AccessibilityObject
Control.AccessibleDefaultActionDescription
Control.AccessibleDescription
Control.AccessibleName
Control.AccessibleRole
AccessibleRole
Adicionar um controle a um formulário
(Windows Forms .NET)
Artigo • 09/02/2023 • 2 minutos para o fim da leitura
) Importante
C#
Label label1 = new Label()
{
Text = "&First Name",
Location = new Point(10, 10),
TabIndex = 10
};
Controls.Add(label1);
Controls.Add(field1);
Confira também
Definir o texto exibido por um controle do Windows Forms
Adicionar um atalho de tecla de acesso a um controle
System.Windows.Forms.Label
System.Windows.Forms.TextBox
System.Windows.Forms.Button
Adicionar um atalho de chave de acesso
a um controle (Windows Forms .NET)
Artigo • 15/02/2023 • 2 minutos para o fim da leitura
Controles que não podem receber foco não podem ter chaves de acesso, exceto
controles de rótulo.
) Importante
Designer
Na janela Propriedades do Visual Studio, defina a propriedade Text como uma cadeia
de caracteres que inclui um e comercial (&) antes da letra que será a chave de acesso.
Por exemplo, para definir a letra "P" como a chave de acesso, insira &Imprimir.
Programático
Defina a Text propriedade como uma cadeia de caracteres que inclui um e comercial
(&) antes da letra que será o atalho.
C#
C#
C#
Confira também
Definir o texto exibido por um controle Windows Forms
System.Windows.Forms.Button
System.Windows.Forms.Label
Como definir o texto exibido por um
controle (Windows Forms .NET)
Artigo • 10/02/2023 • 2 minutos para o fim da leitura
) Importante
Designer
1. Na janela Propriedades no Visual Studio, defina a propriedade Text do controle
como uma cadeia de caracteres apropriada.
Para criar uma tecla de atalho sublinhada, inclua um e comercial (&) antes da letra
que será a tecla de atalho.
2. Na janela Propriedades , selecione o botão de reticências ( ) ao lado da
propriedade Font .
Na caixa de diálogo fonte padrão, ajuste a fonte com configurações como tipo,
tamanho e estilo.
Programático
1. Defina a Text propriedade como uma cadeia de caracteres.
Para criar uma chave de acesso sublinhada, inclua um e comercial (&) antes da
letra que será a chave de acesso.
2. Defina a Font propriedade como um objeto do tipo Font.
C#
7 Observação
Você pode usar um caractere de escape para exibir um caractere especial nos
elementos de interface do usuário que seriam normalmente interpretados de
maneira diferente, como itens de menu. Por exemplo, a seguinte linha de
código define o texto do item de menu para ler "& Agora para algo
completamente diferente":
C#
Confira também
Criar chaves de acesso para controles do Windows Forms
System.Windows.Forms.Control.Text
Como definir a ordem de tabulação no
Windows Forms (Windows Forms .NET)
Artigo • 10/02/2023 • 2 minutos para o fim da leitura
) Importante
acordo com seu TabIndex valor até o último controle. Quando Tab é pressionado no
último controle, o foco é retomado para o próximo controle no pai do contêiner, com
base no próximo TabIndex valor.
Qualquer controle dos muitos em seu formulário pode ser ignorado na ordem de
tabulação. Normalmente, pressionar Tab sucessivamente em tempo de execução
seleciona cada controle na ordem de tabulação. Ao desativar a TabStop propriedade, um
controle é passado na ordem de tabulação do formulário.
Designer
Use a janela Propriedades do designer do Visual Studio para definir a ordem de
tabulação de um controle.
Programático
1. Defina a TabIndex propriedade como um valor numérico.
C#
Button1.TabIndex = 1;
C#
Button1.TabStop = false;
Confira também
Adicionar um controle para um formulário
System.Windows.Forms.Control.TabIndex
System.Windows.Forms.Control.TabStop
Como encaixar e ancorar controles
(Windows Forms .NET)
Artigo • 10/02/2023 • 2 minutos para o fim da leitura
) Importante
Control.Dock
Control.Anchor
Quando o formulário de um controle ancorado é redimensionado, o controle
mantém a distância entre o controle e as posições de âncora. Por exemplo, se você
tiver um TextBox controle ancorado nas bordas esquerda, direita e inferior do
formulário, conforme o formulário for redimensionado, o TextBox controle será
redimensionado horizontalmente para manter a mesma distância dos lados direito
e esquerdo do formulário. O controle também se posiciona verticalmente para que
sua localização seja sempre a mesma distância da borda inferior do formulário. Se
um controle não estiver ancorado e o formulário for redimensionado, a posição do
controle em relação às bordas do formulário será alterada.
Encaixar um controle
Um controle é encaixado definindo sua Dock propriedade.
7 Observação
Controles herdados devem ser Protected para poderem ser encaixados. Para
alterar o nível de acesso de um controle, defina sua propriedade Modificador na
janela Propriedades .
Usar o designer
Use a janela Propriedades do designer do Visual Studio para definir o modo de encaixe
de um controle.
C#
button1.Dock = DockStyle.Right;
Ancorar um controle
Um controle é ancorado em uma borda definindo sua Anchor propriedade como um ou
mais valores.
7 Observação
Controles herdados devem ser Protected para serem ancorados. Para alterar o
nível de acesso de um controle, defina sua propriedade Modifiers na janela
Propriedades.
Usar o designer
Use a janela Propriedades do designer do Visual Studio para definir as bordas
ancoradas de um controle.
3. Para definir ou desafina uma âncora, selecione o braço superior, esquerdo, direito
ou inferior da cruz.
Definir Âncora programaticamente
1. Defina a Anchor propriedade em um controle . Neste exemplo, um botão é
ancorado nos lados direito e inferior de seu contêiner:
C#
Confira também
Posição e layout de controles.
System.Windows.Forms.Control.Anchor
System.Windows.Forms.Control.Dock
Como exibir uma imagem em um
controle (Windows Forms .NET)
Artigo • 10/02/2023 • 2 minutos para o fim da leitura
Vários controles Windows Forms podem exibir imagens. Essas imagens podem ser
ícones que esclarecem a finalidade do controle, como um ícone de diskette em um
botão que indica o comando Salvar. Como alternativa, os ícones podem ser imagens de
plano de fundo para dar ao controle a aparência e o comportamento desejados.
) Importante
2. Selecione o controle .
C#
Confira também
System.Drawing.Image.FromFile
System.Drawing.Image
System.Windows.Forms.Control.BackgroundImage
Como manipular um evento de controle
(Windows Forms .NET)
Artigo • 15/02/2023 • 5 minutos para o fim da leitura
Os eventos para controles (e para formulários) geralmente são definidos por meio do
Visual Designer do Visual Studio para Windows Forms. A configuração de um evento
por meio do Designer Visual é conhecida como manipulação de um evento em tempo
de design. Você também pode lidar com eventos dinamicamente no código, conhecido
como manipulação de eventos em tempo de execução. Um evento criado em tempo de
execução permite que você conecte manipuladores de eventos dinamicamente com
base no que seu aplicativo está fazendo no momento.
) Importante
Definir o manipulador
Use o painel Propriedades para adicionar ou definir o manipulador de um evento:
2. Selecione o controle .
Clique duas vezes no evento para gerar um novo manipulador, ele ficará em
branco se nenhum manipulador for atribuído. Se não estiver em branco, essa
ação abrirá o código do formulário e navegará até o manipulador existente.
Limpar o manipulador
Para remover um manipulador de eventos, você não pode simplesmente excluir o
código do manipulador que está no arquivo code-behind do formulário, ele ainda é
referenciado pelo evento . Use o painel Propriedades para remover o manipulador de
um evento:
2. Selecione o controle .
4. Localize o evento que contém o manipulador que você deseja remover, por
exemplo, o evento Click :
5. Clique com o botão direito do mouse no evento e escolha Redefinir.
Adicionar um manipulador
O exemplo a seguir mostra como criar um controle e adicionar um manipulador de
eventos. Esse controle é criado no Button.Click manipulador de eventos com um botão
diferente. Quando Button1 é pressionado. O código move e dimensiona um novo
botão. O evento do Click novo botão é tratado pelo MyNewButton_Click método . Para
que o novo botão apareça, ele é adicionado à coleção do Controls formulário. Também
há código para remover o Button1.Click manipulador do evento, que é discutido na
seção Remover o manipulador .
C#
Para executar esse código, faça o seguinte em um formulário com o Visual Designer do
Visual Studio:
Para obter mais informações sobre eventos C#, consulte Eventos (C#) Para obter mais
informações sobre eventos do Visual Basic, consulte Eventos (Visual Basic)
Remover o manipulador
A seção Adicionar um manipulador usou algum código para demonstrar a adição de um
manipulador. Esse código também continha uma chamada para remover um
manipulador:
C#
button1.Click -= button1_Click;
Essa sintaxe pode ser usada para remover qualquer manipulador de eventos de
qualquer evento.
Para obter mais informações sobre eventos C#, consulte Eventos (C#) Para obter mais
informações sobre eventos do Visual Basic, consulte Eventos (Visual Basic)
Como usar vários eventos com o mesmo
manipulador
Com o painel Propriedades do Visual Studio Visual Designer, você pode selecionar o
mesmo manipulador já em uso por um evento diferente. Siga as instruções na seção
Definir o manipulador para selecionar um manipulador existente em vez de criar um
novo.
Visual Basic
No Visual Basic, o manipulador é anexado ao evento de um controle no arquivo code-
behind do formulário, em que o código do manipulador de eventos é declarado. Várias
Handles palavras-chave podem ser adicionadas ao código do manipulador de eventos
para usá-lo com vários eventos. O Designer Visual gerará a Handles palavra-chave para
você e a adicionará ao manipulador de eventos. No entanto, você pode fazer isso
facilmente por conta própria para qualquer manipulador de eventos e eventos de
controle, desde que a assinatura do método do manipulador corresponda ao evento.
Para obter mais informações sobre eventos do Visual Basic, consulte Eventos (Visual
Basic)
Esse código demonstra como o mesmo método pode ser usado como um manipulador
para dois eventos diferentes Button.Click :
VB
Confira também
Eventos de controle
Visão geral de eventos
Usando eventos do mouse
Usando eventos de teclado
System.Windows.Forms.Button
Como fazer chamadas thread-safe para
controles (Windows Forms .NET)
Artigo • 15/02/2023 • 4 minutos para o fim da leitura
) Importante
C#
O depurador do Visual Studio detecta essas chamadas de thread não seguras gerando
uma InvalidOperationException com a mensagem, operação entre threads inválida.
Controle acessado de um thread diferente do thread no qual ele foi criado. O
InvalidOperationException sempre ocorre para chamadas entre threads não seguras
durante a depuração do Visual Studio e pode ocorrer no runtime do aplicativo. Você
deve corrigir o problema, mas pode desabilitar a exceção definindo a
Control.CheckForIllegalCrossThreadCalls propriedade como false .
C#
private void button1_Click(object sender, EventArgs e)
{
var threadParameters = new System.Threading.ThreadStart(delegate {
WriteTextSafe("This text was set safely."); });
var thread2 = new System.Threading.Thread(threadParameters);
thread2.Start();
}
C#
private void button1_Click(object sender, EventArgs e)
{
if (!backgroundWorker1.IsBusy)
backgroundWorker1.RunWorkerAsync();
}
) Importante
Eventos de teclado
Todos os controles do Windows Forms herdam um conjunto de eventos relacionados às
entradas de mouse e teclado. Por exemplo, um controle pode manipular o KeyPress
evento para determinar o código de caractere de uma tecla que foi pressionada. Para
obter mais informações, consulte Usando eventos de teclado.
PreFilterMessage Este método intercepta mensagens do Windows que estão na fila (também
chamadas de postadas) no nível do aplicativo.
Tipos de chaves
Windows Forms identifica a entrada do teclado como códigos de tecla virtual
representados pela enumeração bit a bitKeys. Com a Keys enumeração , você pode
combinar uma série de teclas pressionadas para resultar em um único valor. Esses
valores correspondem aos valores que acompanham o WM_KEYDOWN e
WM_SYSKEYDOWN mensagens do Windows. Você pode detectar a maioria das teclas
físicas pressionando os KeyDown eventos ou KeyUp . As teclas de caractere são um
subconjunto da Keys enumeração e correspondem aos valores que acompanham o
WM_CHAR e WM_SYSCHAR mensagens do Windows. Se a combinação de teclas
pressionadas resultar em um caractere, você poderá detectar o caractere manipulando o
KeyPress evento.
1. O usuário envia por push a chave "a", a chave é pré-processada, expedida e ocorre
um KeyDown evento.
2. O usuário mantém a chave "a", a chave é pré-processada, expedida e ocorre um
KeyPress evento. Esse evento ocorre várias vezes enquanto o usuário pressiona
uma tecla.
3. O usuário libera a chave "a", a chave é pré-processada, expedida e ocorre um
KeyUp evento.
Chaves de pré-processamento
Assim como outras mensagens, as mensagens de teclado são processadas no WndProc
método de um formulário ou controle. No entanto, antes que as mensagens de teclado
sejam processadas, o PreProcessMessage método chama um ou mais métodos que
podem ser substituídos para lidar com teclas de caracteres especiais e teclas físicas.
Você pode substituir esses métodos para detectar e filtrar certas teclas antes que as
mensagens sejam processadas pelo controle. A tabela a seguir mostra a ação que está
sendo executada e o método relacionado que ocorre, na ordem em que o método
ocorre.
Verifique se há uma ProcessCmdKey Este método processa uma chave de comando, que
chave de comando tem precedência sobre teclas regulares. Se esse
como um acelerador método retornar true , a mensagem principal não
ou um atalho de menu. será enviada e um evento de tecla não ocorrerá. Se
retornar false , IsInputKey será chamado .
Verifique se há uma ProcessDialogKey Este método processa uma tecla física que utiliza
tecla de navegação uma funcionalidade especial dentro do controle,
(teclas ESC, TAB, Enter como alternar o foco entre o controle e seu pai. Se
ou teclas de seta). o controle imediato não manipular a chave, o
ProcessDialogKey será chamado no controle pai e
assim por diante para o controle superior na
hierarquia. Se esse método retornar true , o pré-
processamento estará completo e um evento de
tecla não será gerado. Se ele retornar false ,
ocorrerá um KeyDown evento .
Tarefa Método
Intercepte uma chave de navegação e gere um Substitua IsInputKey. Nota: Como alternativa,
KeyDown evento. Por exemplo, você deseja que você pode manipular o PreviewKeyDown
as teclas TAB e Enter sejam identificadas em uma evento e definir IsInputKey o
caixa de texto. PreviewKeyDownEventArgs como true para a
chave ou as chaves desejadas.
Confira também
Keys
WndProc
PreProcessMessage
Usando eventos de teclado (Windows Forms .NET)
Como modificar eventos de tecla de teclado (Windows Forms .NET)
Como verificar se há pressionamentos de tecla modificadora (Windows Forms
.NET)
Como simular eventos de teclado (Windows Forms .NET)
Como manipular mensagens de entrada de teclado no formulário (Windows Forms
.NET)
Adicionar um controle (Windows Forms .NET)
Usando eventos de teclado (Windows
Forms .NET)
Artigo • 15/02/2023 • 2 minutos para o fim da leitura
) Importante
Eventos de teclado
O Windows Forms fornece dois eventos que ocorrem quando um usuário pressiona
uma tecla do teclado e um evento quando um usuário libera uma tecla do teclado:
Quando um usuário pressiona uma tecla, o Windows Forms determina qual evento deve
ser gerado com base em se a mensagem do teclado especifica uma tecla de caractere
ou uma tecla física. Para obter mais informações sobre teclas físicas e de caracteres,
consulte Visão geral do teclado, eventos de teclado.
KeyPress Esse evento é gerado quando as teclas KeyPress é gerado após KeyDown.
são pressionadas resultam em um
caractere. Por exemplo, um usuário
pressiona as teclas SHIFT e a letra “a” O manipulador para KeyPress
minúscula, o que resulta em uma letra recebimentos:
“A” maiúscula. Um KeyPressEventArgs parâmetro ,
que contém o código de caractere
da tecla que foi pressionada. Esse
código de caractere é exclusivo para
cada combinação de uma tecla de
caractere e tecla modificadora.
Um KeyEventArgs parâmetro:
Confira também
Visão geral do uso do teclado (Windows Forms .NET)
Como modificar eventos de tecla de teclado (Windows Forms .NET)
Como verificar se há pressionamentos de tecla modificadora (Windows Forms
.NET)
Como simular eventos de teclado (Windows Forms .NET)
Como manipular mensagens de entrada de teclado no formulário (Windows Forms
.NET)
Visão geral de como validar a entrada
do usuário (Windows Forms .NET)
Artigo • 10/02/2023 • 6 minutos para o fim da leitura
Quando os usuários inserem dados em seu aplicativo, convém verificar se os dados são
válidos antes de seu aplicativo utilizá-los. Você pode exigir que determinados campos
de texto não sejam de comprimento zero, que um campo formatado como um número
de telefone ou que uma cadeia de caracteres não contenha caracteres inválidos. O
Windows Forms fornece várias maneiras para validar a entrada em seu aplicativo.
) Importante
Controle MaskedTextBox
Se você precisar exigir que os usuários insiram dados em um formato bem definido,
como um número de telefone ou um número de parte, você pode fazer isso
rapidamente e com o mínimo de código usando o MaskedTextBox controle . Uma
máscara é uma cadeia de caracteres composta de caracteres de uma linguagem de
mascaramento que especifica quais caracteres podem ser inseridos em qualquer
posição determinada de uma caixa de texto. O controle exibe um conjunto de avisos
para o usuário. Se o usuário digita uma entrada incorreta, como digitar uma letra
quando é necessário um dígito, o controle rejeitará automaticamente a entrada.
Se o código postal deve ser um CEP válido dos Estados Unidos, você poderia
chamar um serviço Web de código postal para validar os dados inseridos pelo
usuário.
) Importante
Se você tiver uma validação personalizada que ocorre após o Validating evento, ela
não afetará a associação de dados. Por exemplo, se você tiver código em um
Validated evento que tente cancelar a associação de dados, a associação de dados
ainda ocorrerá. Nesse caso, para executar a Validated validação no evento, altere a
propriedade do Binding.DataSourceUpdateMode controle de
DataSourceUpdateMode.OnValidation para DataSourceUpdateMode.Nevere
adicione your-control.DataBindings["field-name"].WriteValue() ao código de
validação.
Validação implícita
A abordagem de validação implícita valida os dados enquanto o usuário os digita.
Valide os dados lendo as teclas conforme elas são pressionadas ou mais comumente
sempre que o usuário tira o foco de entrada do controle. Essa abordagem é útil quando
você deseja fornecer ao usuário comentários imediatos sobre os dados enquanto eles
estão funcionando.
Se você quiser usar a validação implícita para um controle, deverá definir a propriedade
desse AutoValidate controle como EnablePreventFocusChange ou
EnableAllowFocusChange. Se você cancelar o Validating evento, o comportamento do
controle será determinado pelo valor atribuído a AutoValidate. Se você atribuiu
EnablePreventFocusChange, cancelar o evento fará com que o Validated evento não
ocorra. O foco de entrada permanecerá no controle atual até que o usuário altere os
dados para um formato válido. Se você atribuiu EnableAllowFocusChange, o Validated
evento não ocorrerá quando você cancelar o evento, mas o foco ainda será alterado
para o próximo controle.
Atribuir Disable à AutoValidate propriedade impede completamente a validação
implícita. Para validar seus controles, você precisará usar a validação explícita.
Validação explícita
A abordagem de validação explícita valida os dados de uma só vez. Você pode validar
os dados em resposta a uma ação do usuário, como clicar em um botão Salvar ou em
um link Avançar . Quando a ação do usuário ocorre, você pode disparar a validação
explícita de uma das seguintes maneiras:
ContainerControl Inherit
Form EnableAllowFocusChange
SplitContainer Inherit
UserControl EnableAllowFocusChange
No entanto, em alguns casos, você talvez queira permitir que o usuário feche o
formulário independentemente se os valores nos controles são válidos. Você pode
substituir a validação e fechar um formulário que ainda contém dados inválidos criando
um manipulador para o evento do FormClosing formulário. No evento, defina a Cancel
propriedade como false . Isso força o formulário a fechar. Para obter mais informações
e um exemplo, consulte Form.FormClosing.
7 Observação
Se você forçar o formulário a fechar desta maneira, todos os dados nos controles
do formulário que ainda não tiverem sido salvos serão perdidos. Além disso, os
formulários modais não validam o conteúdo dos controles quando são fechados.
Você ainda pode usar a validação de controle para bloquear o foco em um
controle, mas não precisa se preocupar com o comportamento associado ao
fechamento do formulário.
Confira também
Usando eventos de teclado (Windows Forms .NET)
Control.Validating
Form.FormClosing
System.Windows.Forms.FormClosingEventArgs
Como modificar eventos de tecla de
teclado (Windows Forms .NET)
Artigo • 09/02/2023 • 3 minutos para o fim da leitura
) Importante
-ou-
7 Observação
C#
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == 'a' || e.KeyChar == 'A')
e.Handled = true;
}
C#
C#
if (m.Msg == WM_KEYDOWN)
{
Keys keyCode = (Keys)m.WParam & Keys.KeyCode;
Confira também
Visão geral do uso do teclado (Windows Forms .NET)
Usando eventos de teclado (Windows Forms .NET)
Keys
KeyDown
KeyPress
Como verificar se há pressionamentos
de tecla modificador (Windows Forms
.NET)
Artigo • 15/02/2023 • 2 minutos para o fim da leitura
À medida que o usuário digita chaves em seu aplicativo, você pode monitorar as teclas
modificadoras pressionadas, como SHIFT , ALT e CTRL . Quando uma tecla modificadora
é pressionada em combinação com outras teclas ou até mesmo um clique do mouse,
seu aplicativo pode responder adequadamente. Por exemplo, pressionar a tecla S pode
fazer com que um "s" apareça na tela. Se as teclas CTRL+S forem pressionadas, o
documento atual poderá ser salvo.
) Importante
Keys.Shift
Keys.ShiftKey
Keys.RShiftKey
Keys.LShiftKey
O valor correto para testar SHIFT como uma chave modificadora é Keys.Shift. Da mesma
forma, para testar CTRL e ALT como modificadores, você deve usar os Keys.Control
valores e Keys.Alt , respectivamente.
Detectar chave modificadora
Detecte se uma tecla modificadora é pressionada comparando a ModifierKeys
propriedade e o valor de Keys enumeração com um operador AND bit a bit.
C#
Confira também
Visão geral do uso do teclado (Windows Forms .NET)
Usando eventos de teclado (Windows Forms .NET)
Keys
ModifierKeys
KeyDown
KeyPress
Como manipular mensagens de entrada
de teclado no formulário (Windows
Forms .NET)
Artigo • 15/02/2023 • 2 minutos para o fim da leitura
) Importante
C#
// Detect all numeric characters at the form level and consume 1,4, and 7.
// Form.KeyPreview must be set to true for this event handler to be called.
void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar >= 48 && e.KeyChar <= 57)
{
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' pressed.");
switch (e.KeyChar)
{
case (char)49:
case (char)52:
case (char)55:
MessageBox.Show($"Form.KeyPress: '{e.KeyChar}' consumed.");
e.Handled = true;
break;
}
}
}
Confira também
Visão geral do uso do teclado (Windows Forms .NET)
Usando eventos de teclado (Windows Forms .NET)
Keys
ModifierKeys
KeyDown
KeyPress
Como simular eventos de teclado
(Windows Forms .NET)
Artigo • 10/02/2023 • 3 minutos para o fim da leitura
) Importante
Usar SendKeys
Windows Forms fornece a System.Windows.Forms.SendKeys classe para enviar
pressionamentos de tecla para o aplicativo ativo. Há dois métodos para enviar
pressionamentos de tecla para um aplicativo: SendKeys.Send e SendKeys.SendWait. A
diferença entre os dois métodos é que SendWait bloqueia o thread atual quando o
pressionamento de tecla é enviado, aguardando uma resposta, enquanto Send não o
faz. Para obter mais informações sobre SendWait , consulte Para enviar um
pressionamento de tecla para um aplicativo diferente.
U Cuidado
Nos bastidores, SendKeys o usa uma implementação mais antiga do Windows para
enviar entradas, o que pode falhar no Windows moderno em que se espera que o
aplicativo não esteja em execução com direitos administrativos. Se a implementação
mais antiga falhar, o código tentará automaticamente a implementação mais recente do
Windows para enviar entrada. Além disso, quando a SendKeys classe usa a nova
implementação, o SendWait método não bloqueia mais o thread atual ao enviar
pressionamentos de tecla para outro aplicativo.
) Importante
Se o aplicativo depender de um comportamento consistente, independentemente
do sistema operacional, você poderá forçar a SendKeys classe a usar a nova
implementação adicionando a seguinte configuração de aplicativo ao arquivo
app.config.
XML
<appSettings>
<add key="SendKeys" value="SendInput"/>
</appSettings>
Para forçar a SendKeys classe a usar apenas a implementação anterior, use o valor
"JournalHook" em vez disso.
O exemplo de código a seguir usa para simular pressionar as teclas Send ALT e DOWN
juntas. Esses pressionamentos de tecla fazem com que o ComboBox controle exiba sua
lista suspensa. Este exemplo pressupõe um Form com um Button e ComboBox.
C#
Calculadora e, em seguida, chama Send para emitir uma série de cálculos para o
aplicativo Calculadora.
C#
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);
if (SetForegroundWindow(calcWindow))
SendKeys.Send("10{+}10=");
}
OnKeyDown
OnKeyPress
OnKeyUp
Para obter mais informações sobre esses eventos, consulte Usando eventos de teclado
(Windows Forms .NET).
Confira também
Visão geral do uso do teclado (Windows Forms .NET)
Usando eventos de teclado (Windows Forms .NET)
Usando eventos do mouse (Windows Forms .NET)
SendKeys
Keys
KeyDown
KeyPress
Visão geral do uso do mouse (Windows
Forms .NET)
Artigo • 09/02/2023 • 4 minutos para o fim da leitura
) Importante
Eventos de mouse
Todos os controles do Windows Forms herdam um conjunto de eventos relacionados às
entradas de mouse e teclado. Por exemplo, um controle pode manipular o MouseClick
evento para determinar o local de um clique do mouse. Para obter mais informações
sobre os eventos do mouse, consulte Usando eventos do mouse.
Usado com o evento do mouse apropriado, MouseHover por exemplo, o teste de clique
é muito útil para determinar quando seu aplicativo deve executar uma ação específica.
Propriedade Descrição
MouseWheelPresent Obtém um valor que indica se um mouse com botão de rolagem está
instalado.
Método Observações
PreFilterMessage Este método intercepta mensagens do Windows que estão na fila (também
chamadas de postadas) no nível do aplicativo.
Confira também
Usando eventos do mouse (Windows Forms .NET)
Visão geral do comportamento do mouse de arrastar e soltar (Windows Forms
.NET)
Gerenciar ponteiros do mouse (Windows Forms .NET)
Usando eventos do mouse (Windows
Forms .NET)
Artigo • 10/02/2023 • 6 minutos para o fim da leitura
) Importante
Eventos de mouse
A principal maneira de responder a entradas de mouse é manipular eventos de mouse.
A tabela a seguir mostra os eventos do mouse e descreve quando eles são gerados.
Eventos de Descrição
mouse
MouseClick Este evento ocorre quando o usuário clica no controle com o mouse. O
manipulador para esse evento recebe um argumento do tipo
MouseEventArgs. Manipule este evento quando você precisar obter
informações sobre o mouse quando um clique ocorrer.
DoubleClick Este evento ocorre quando um usuário clica duas vezes no controle. O
manipulador para esse evento recebe um argumento do tipo EventArgs.
Manipule este evento quando você só precisar determinar quando um
clique duplo ocorrer.
MouseDoubleClick Este evento ocorre quando o usuário clica duas vezes no controle com o
mouse. O manipulador para esse evento recebe um argumento do tipo
MouseEventArgs. Manipule este evento quando você precisar obter
informações sobre o mouse quando um clique duplo ocorrer.
Eventos de Descrição
mouse
MouseDown Este evento ocorre quando o ponteiro do mouse está sobre o controle e um
botão do mouse é pressionado. O manipulador para esse evento recebe um
argumento do tipo MouseEventArgs.
MouseEnter Este evento ocorre quando o ponteiro do mouse entra na borda ou na área
de cliente do controle, dependendo do tipo de controle. O manipulador
para esse evento recebe um argumento do tipo EventArgs.
MouseHover Este evento ocorre quando o ponteiro do mouse para e permanece sobre o
controle. O manipulador para esse evento recebe um argumento do tipo
EventArgs.
MouseLeave Este evento ocorre quando o ponteiro do mouse deixa a borda ou a área de
cliente do controle, dependendo do tipo de controle. O manipulador para
esse evento recebe um argumento do tipo EventArgs.
MouseMove Este evento ocorre quando o ponteiro do mouse se move enquanto está
sobre um controle. O manipulador para esse evento recebe um argumento
do tipo MouseEventArgs.
MouseUp Este evento ocorre quando o ponteiro do mouse está sobre o controle e o
usuário libera um botão do mouse. O manipulador para esse evento recebe
um argumento do tipo MouseEventArgs.
MouseWheel Este evento ocorre quando o usuário gira o botão de rolagem do mouse
enquanto o controle está em foco. O manipulador para esse evento recebe
um argumento do tipo MouseEventArgs. Você pode usar a Delta
propriedade de MouseEventArgs para determinar até que ponto o mouse
foi rolado.
Informações do mouse
Um MouseEventArgs é enviado para os manipuladores de eventos do mouse
relacionados a clicar em um botão do mouse e acompanhar os movimentos do mouse.
MouseEventArgs fornece informações sobre o estado atual do mouse, incluindo o local
do ponteiro do mouse nas coordenadas do cliente, quais botões do mouse são
pressionados e se a roda do mouse rolou. Vários eventos do mouse, como aqueles que
são gerados quando o ponteiro do mouse inseriu ou saiu dos limites de um controle,
enviam um EventArgs para o manipulador de eventos sem mais informações.
Se você quiser saber o estado atual dos botões do mouse ou o local do ponteiro do
mouse e quiser evitar manipular um evento do mouse, também poderá usar as
MouseButtons propriedades e MousePosition da Control classe . MouseButtons retorna
informações sobre quais botões do mouse estão pressionados no momento. O
MousePosition retorna as coordenadas de tela do ponteiro do mouse e é equivalente ao
valor retornado por Position.
1. MouseDown .
2. Click .
3. MouseClick .
4. MouseUp .
Veja a seguir a ordem dos eventos gerados para um clique duplo no botão do mouse:
1. MouseDown .
2. Click .
3. MouseClick .
4. MouseUp .
5. MouseDown .
6. DoubleClick .
8. MouseUp .
Controles individuais
Os seguintes controles não estão em conformidade com o comportamento de evento
de clique do mouse padrão:
Button
CheckBox
ComboBox
RadioButton
7 Observação
7 Observação
Controle ListView
7 Observação
Controle TreeView
7 Observação
7 Observação
Confira também
Visão geral do uso do mouse (Windows Forms .NET)
Gerenciar ponteiros do mouse (Windows Forms .NET)
Como simular eventos do mouse (Windows Forms .NET)
System.Windows.Forms.Control
Visão geral do comportamento do
mouse de arrastar e soltar (Windows
Forms .NET)
Artigo • 15/02/2023 • 3 minutos para o fim da leitura
) Importante
Eventos Descrição
de mouse
DragEnter Esse evento ocorre quando um objeto é arrastado para os limites do controle. O
manipulador para esse evento recebe um argumento do tipo DragEventArgs.
DragOver Esse evento ocorre quando um objeto é arrastado enquanto o ponteiro do mouse
está dentro dos limites do controle. O manipulador para esse evento recebe um
argumento do tipo DragEventArgs.
Eventos Descrição
de mouse
DragDrop Esse evento ocorre quando uma operação do tipo "arrastar e soltar" é concluída. O
manipulador para esse evento recebe um argumento do tipo DragEventArgs.
DragLeave Esse evento ocorre quando um objeto é arrastado para fora dos limites do controle.
O manipulador para esse evento recebe um argumento do tipo EventArgs.
GiveFeedback Esse evento ocorre durante uma operação de arrastar. Ele fornece uma
indicação visual para o usuário que a operação do tipo "arrastar e soltar"
está ocorrendo, como uma alteração no ponteiro do mouse. O
manipulador para esse evento recebe um argumento do tipo
GiveFeedbackEventArgs.
QueryContinueDrag Esse evento é gerado durante uma operação do tipo "arrastar e soltar" e
permite que a fonte de arrastar determine se a operação do tipo "arrastar e
soltar" deve ser cancelada. O manipulador para esse evento recebe um
argumento do tipo QueryContinueDragEventArgs.
C#
// Set the effect filter and allow the drop on this control
private void textBox1_DragOver(object sender, DragEventArgs e) =>
e.Effect = DragDropEffects.All;
Para obter mais informações sobre os efeitos de arrastar, consulte Data e AllowedEffect.
Confira também
Visão geral do uso do mouse (Windows Forms .NET)
Control.DragDrop
Control.DragEnter
Control.DragLeave
Control.DragOver
Como distinguir entre cliques e cliques
duplos (Windows Forms .NET)
Artigo • 15/02/2023 • 4 minutos para o fim da leitura
) Importante
Este exemplo de código usa um novo controle de botão que permite cliques duplos:
C#
public partial class DoubleClickButton : Button
{
public DoubleClickButton()
{
// Set the style so a double click event occurs.
SetStyle(ControlStyles.StandardClick |
ControlStyles.StandardDoubleClick, true);
}
}
O código a seguir demonstra como um formulário altera o estilo da borda com base em
um clique ou clique duas vezes no novo controle de botão:
C#
public Form1()
{
InitializeComponent();
}
Controls.Add(button1);
}
C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
namespace project
{
public partial class Form2 : Form
{
private DateTime _lastClick;
private bool _inDoubleClick;
private Rectangle _doubleClickArea;
private TimeSpan _doubleClickMaxTime;
private Action _doubleClickAction;
private Action _singleClickAction;
private Timer _clickTimer;
public Form2()
{
InitializeComponent();
_doubleClickMaxTime =
TimeSpan.FromMilliseconds(SystemInformation.DoubleClickTime);
return;
}
SystemInformation.DoubleClickSize);
}
_singleClickAction();
}
}
}
Confira também
Visão geral do uso do mouse (Windows Forms .NET)
Usando eventos do mouse (Windows Forms .NET)
Gerenciar ponteiros do mouse (Windows Forms .NET)
Como simular eventos do mouse (Windows Forms .NET)
Control.Click
Control.MouseDown
Control.SetStyle
Gerenciar ponteiros do mouse
(Windows Forms .NET)
Artigo • 10/02/2023 • 2 minutos para o fim da leitura
) Importante
C#
C#
O exemplo a seguir altera o cursor do ponteiro do mouse para um botão para uma
mão:
C#
button2.Cursor = System.Windows.Forms.Cursors.Hand;
Para exibir o ponteiro de espera, que se assemelha a uma ampulheta, sempre que o
ponteiro do mouse estiver no controle, use a UseWaitCursor propriedade da Control
classe .
Confira também
Visão geral do uso do mouse (Windows Forms .NET)
Usando eventos do mouse (Windows Forms .NET)
Como distinguir entre cliques e cliques duplos (Windows Forms .NET)
Como simular eventos do mouse (Windows Forms .NET)
System.Windows.Forms.Cursor
Cursor.Position
Como simular eventos do mouse
(Windows Forms .NET)
Artigo • 09/02/2023 • 2 minutos para o fim da leitura
Simular eventos do mouse em Windows Forms não é tão simples quanto simular
eventos de teclado. Windows Forms não fornece uma classe auxiliar para mover o
mouse e invocar ações de clique do mouse. A única opção para controlar o mouse é
usar métodos nativos do Windows. Se você estiver trabalhando com um controle
personalizado ou um formulário, poderá simular um evento do mouse, mas não poderá
controlar diretamente o mouse.
) Importante
Eventos
A maioria dos eventos tem um método correspondente que os invoca, nomeado no
padrão de On seguido por EventName , como OnMouseMove . Essa opção só é possível em
formulários ou controles personalizados, pois esses métodos são protegidos e não
podem ser acessados de fora do contexto do controle ou formulário. A desvantagem de
usar um método como OnMouseMove é que ele realmente não controla o mouse ou
interage com o controle, ele simplesmente gera o evento associado. Por exemplo, se
você quiser simular passar o mouse sobre um item em um ListBoxe OnMouseMove o
ListBox não reagir visualmente com um item realçado sob o cursor.
OnMouseDown
OnMouseEnter
OnMouseHover
OnMouseLeave
OnMouseMove
OnMouseUp
OnMouseWheel
OnMouseClick
OnMouseDoubleClick
Para obter mais informações sobre esses eventos, consulte Usando eventos do mouse
(Windows Forms .NET)
Invocar um clique
Considerando que a maioria dos controles faz algo quando clicado, como um botão que
chama o código do usuário ou a caixa de seleção altera seu estado marcado, Windows
Forms fornece uma maneira fácil de disparar o clique. Alguns controles, como uma caixa
de combinação, não fazem nada especial quando clicado e simular um clique não tem
efeito sobre o controle.
Performclick
A System.Windows.Forms.IButtonControl interface fornece o PerformClick método que
simula um clique no controle . System.Windows.Forms.Button Os controles e
System.Windows.Forms.LinkLabel implementam essa interface.
C#
button1.PerformClick();
InvokeClick
Com um formulário de um controle personalizado, use o InvokeOnClick método para
simular um clique do mouse. Esse é um método protegido que só pode ser chamado de
dentro do formulário ou de um controle personalizado derivado.
C#
Confira também
Visão geral do uso do mouse (Windows Forms .NET)
Usando eventos do mouse (Windows Forms .NET)
Como distinguir entre cliques e cliques duplos (Windows Forms .NET)
Gerenciar ponteiros do mouse (Windows Forms .NET)
Visão geral do componente PrintDialog
(Windows Forms .NET)
Artigo • 08/02/2023 • 4 minutos para o fim da leitura
C#
printDialog1.Document = printDocument1;
C#
Você terá que codificar sua própria lógica de impressão. Além disso, você precisará
especificar o material a ser impresso.
Talvez você também queira escrever código para eventos e eventos BeginPrintEndPrint .
Ele ajudará a incluir um inteiro que representa o número total de páginas a serem
impressas que são deccrementados conforme cada página é impressa.
7 Observação
C#
printDocument1.DocumentName = "SamplePrintApp";
2. Escreva código para manipular o EndPrint evento.
C#
7 Observação
Imprimir texto
1. Em Visual Studio, clique duas vezes no formulário do qual você deseja imprimir, no
painel Gerenciador de Soluções. Isso abre o Visual Designer.
C#
C#
printDocument1.DocumentName = docName;
stringToPrint = System.IO.File.ReadAllText(fullPath);
printDocument1.Print();
}
C#
Confira também
Graphics
Brush
Visão geral do componente PrintDialog
Como imprimir um formulário
(Windows Forms .NET)
Artigo • 08/02/2023 • 2 minutos para o fim da leitura
Exemplo
C#
namespace Sample_print_win_form1
{
public partial class Form1 : Form
{
Bitmap memoryImage;
public Form1()
{
InitializeComponent();
}
printDocument1.Print();
}
private void PrintDocument1_PrintPage(System.Object sender,
System.Drawing.Printing.PrintPageEventArgs e) =>
e.Graphics.DrawImage(memoryImage, 0, 0);
}
}
Programação robusta
As seguintes condições podem causar uma exceção:
Segurança do .NET
Para executar este exemplo de código, você deve ter permissão para acessar a
impressora que usa com seu computador.
Confira também
PrintDocument
Como: renderizar imagens com o GDI+
Como: imprimir elementos gráficos no Windows Forms
Imprimir usando visualização de
impressão (Windows Forms .NET)
Artigo • 08/02/2023 • 4 minutos para o fim da leitura
C#
7 Observação
C#
C#
printPreviewDialog1.Document = printDocument1;
C#
printPreviewDialog1.Document = printDocument1;
printPreviewDialog1.ShowDialog();
}
Confira também
Visão geral do componente PrintDialog
Imprimir um arquivo de texto de várias páginas
Impressão mais segura no Windows Forms
Visão geral da associação de dados
(Windows Forms .NET)
Artigo • 08/02/2023 • 16 minutos para o fim da leitura
No Windows Forms, você pode vincular não apenas a fontes de dados tradicionais, mas
também a praticamente qualquer estrutura que contenha dados. Você pode vincular a
uma matriz de valores que você calcula no tempo de execução, lê de um arquivo ou
deriva dos valores de outros controles.
Além disso, você pode vincular qualquer propriedade de qualquer controle à fonte de
dados. Na vinculação de dados tradicional, você geralmente vincula a propriedade de
exibição — por exemplo, a propriedade Text de um controle TextBox — à fonte de
dados. Com o .NET, você também tem a opção de definir outras propriedades por meio
da associação. É possível usar a vinculação para realizar as seguintes tarefas:
Interface IList
Uma classe que implementa a IList interface pode ser um Array, ArrayListou
CollectionBase. São listas indexadas de itens de tipo Object e as listas devem
conter tipos homogêneos, pois o primeiro item do índice determina o tipo. IList
estaria disponível para associação somente em tempo de execução.
7 Observação
Se você quiser criar uma lista de objetos de negócios para associação com
Windows Forms, considere usar o BindingList<T>. É BindingList uma classe
extensível que implementa as interfaces primárias necessárias para a
associação de dados de Windows Forms bidirecional.
Interface IBindingList
Uma classe que implementa a IBindingList interface fornece um nível muito maior
de funcionalidade de associação de dados. Essa implementação oferece recursos
básicos de classificação e notificação de alteração. Ambos são úteis quando os
itens da lista são alterados e quando a própria lista é alterada. A notificação de
alteração será importante se você planeja ter vários controles associados aos
mesmos dados. Ele ajuda você a fazer alterações de dados feitas em um dos
controles para propagar para os outros controles associados.
7 Observação
7 Observação
Interface IBindingListView
Interface IEditableObject
O EndEdit método envia por push todas as alterações desde BeginEdit que foi
chamado para o objeto subjacente, se o objeto estiver atualmente no modo de
edição.
Interface ICancelAddNew
Interface IDataErrorInfo
Interface IEnumerable
7 Observação
7 Observação
Interface ICustomTypeDescriptor
7 Observação
Interface IListSource
Interface IRaiseItemChangedEvents
Interface ISupportInitialize
Interface ISupportInitializeNotification
Interface INotifyPropertyChanged
Uma classe que implementa essa interface é um tipo que aciona um evento
quando qualquer um dos seus valores de propriedade são alterados. Essa interface
foi projetada para substituir o padrão de ter um evento de alteração para cada
propriedade de um controle. Quando usado em um BindingList<T>, um objeto de
negócios deve implementar a INotifyPropertyChanged interface e o BindingList'1
converterá PropertyChanged eventos em ListChanged eventos do tipo
ItemChanged.
7 Observação
Para que a notificação de alteração ocorra em uma associação entre um
cliente associado e uma fonte de dados, seu tipo de fonte de dados associada
deve implementar a INotifyPropertyChanged interface (preferencial) ou você
pode fornecer eventos propertyName Changed para o tipo associado, mas você
não deve fazer ambos.
Interface IBindableComponent
Uma classe que implementa essa interface é um componente de não controle que
dá suporte à vinculação de dados. Essa classe retorna as associações de dados e o
contexto de associação do componente por meio da DataBindings e
BindingContext das propriedades dessa interface.
7 Observação
Interface ICurrencyManagerProvider
7 Observação
A lista a seguir mostra as estruturas a que você pode associar no Windows Forms.
BindingSource
Objetos simples
Matriz ou Coleção
Para atuar como uma fonte de dados, uma lista deve implementar a IList interface;
um exemplo seria uma matriz que é uma instância da Array classe. Para obter mais
informações sobre matrizes, consulte Como criar uma matriz de objetos (Visual
Basic).
Em geral, você deve usar BindingList<T> quando criar listas de objetos para
associação de dados. BindingList é uma versão genérica da IBindingList interface.
A IBindingList interface estende a interface adicionando IList propriedades,
métodos e eventos necessários para associação de dados bidirecional.
IEnumerable
Windows Forms controles podem ser associados a fontes de dados que só dão
suporte à IEnumerable interface se estiverem associadas por meio de um
BindingSource componente.
DataColumn
DataTable
DataView
DataSet
DataViewManager
Tipo de Descrição
vinculação
de dados
Cenário Descrição
Relatórios Os relatórios fornecem uma maneira flexível para exibir e resumir dados em
um documento impresso. É comum criar um relatório que imprime o conteúdo
selecionado de uma fonte de dados na tela ou em uma impressora. Relatórios
comuns incluem listas, faturas e resumos. Os itens são formatados em colunas
de listas, com subitens organizados em cada item de lista, mas você deve
escolher o layout que melhor se adequa aos dados.
Confira também
Binding
Visão geral da vinculação de dados
Criar ótimas fontes de dados com notificação de alteração
Criar um controle de associação simples (Windows Forms .NET)
Componente BindingSource
Como: Associar o controle DataGrid do Windows Forms a uma fonte de dados
Criar ótimas fontes de dados com
notificação de alteração (Windows
Forms .NET)
Artigo • 08/02/2023 • 10 minutos para o fim da leitura
Associação baseada em lista, que pode incluir uma única propriedade de controle
associada à propriedade de um item em uma lista ou uma propriedade de controle
associada a uma lista de objetos.
Além disso, se você estiver criando Windows Forms controles que deseja usar para
associação de dados, deverá aplicar o padrão PropertyNameChanged aos controles. A
aplicação de padrão aos controles resulta em alterações na propriedade associada de
um controle são propagadas para a fonte de dados.
C#
// This class implements a simple user control
// that demonstrates how to apply the propertyNameChanged pattern.
[ComplexBindingProperties("DataSource", "DataMember")]
public class CustomerControl : UserControl
{
private DataGridView dataGridView1;
private Label label1;
private DateTime lastUpdate = DateTime.Now;
public CustomerControl()
{
this.dataGridView1 = new System.Windows.Forms.DataGridView();
this.label1 = new System.Windows.Forms.Label();
this.dataGridView1.ColumnHeadersHeightSizeMode =
System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridView1.ImeMode = System.Windows.Forms.ImeMode.Disable;
this.dataGridView1.Location = new System.Drawing.Point(100, 100);
this.dataGridView1.Size = new System.Drawing.Size(500,500);
this.dataGridView1.TabIndex = 1;
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(50, 50);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(76, 13);
this.label1.TabIndex = 2;
this.label1.Text = "Customer List:";
this.Controls.Add(this.label1);
this.Controls.Add(this.dataGridView1);
this.Size = new System.Drawing.Size(450, 250);
}
}
Implementar a interface
INotifyPropertyChanged
O exemplo de código a seguir demonstra como implementar a INotifyPropertyChanged
interface. Implemente a interface em objetos de negócios que são usados em Windows
Forms associação de dados. Quando implementada, a interface se comunica com um
controle associado que a propriedade muda em um objeto de negócios.
C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Runtime.CompilerServices;
using System.Windows.Forms;
public Form3()
{
InitializeComponent();
// Set up the "Change Item" button.
this.changeItemBtn.Text = "Change Item";
this.changeItemBtn.Dock = DockStyle.Bottom;
this.changeItemBtn.Height = 100;
//this.changeItemBtn.Click +=
// new EventHandler(changeItemBtn_Click);
this.Controls.Add(this.changeItemBtn);
}
// This is a simple customer class that
// implements the IPropertyChange interface.
public class DemoCustomer1 : INotifyPropertyChanged
{
// These fields hold the values for the public properties.
private Guid idValue = Guid.NewGuid();
private string customerNameValue = String.Empty;
private string phoneNumberValue = String.Empty;
set
{
if (value != this.phoneNumberValue)
{
this.phoneNumberValue = value;
NotifyPropertyChanged();
}
}
}
}
}
Sincronizar associações
Durante a implementação da associação de dados em Windows Forms, vários controles
são associados à mesma fonte de dados. Em alguns casos, pode ser necessário executar
etapas adicionais para garantir que as propriedades associadas dos controles
permaneçam sincronizadas entre si e à fonte de dados. Essas etapas são necessárias em
duas situações:
No primeiro caso, você pode usar um BindingSource para associar a fonte de dados aos
controles. No último caso, você usa um BindingSource evento e manipula o
BindingComplete evento e chama EndCurrentEdit o associado BindingManagerBase.
Para obter mais informações sobre como implementar esse conceito, consulte a página
de referência da API BindingComplete.
Confira também
Associação de dados
BindingSource
INotifyPropertyChanged
BindingList<T>
Navegar pelos dados (Windows Forms
.NET)
Artigo • 08/02/2023 • 6 minutos para o fim da leitura
A maneira mais fácil de navegar pelos registros em uma fonte de dados é associar um
BindingSource componente à fonte de dados e associar controles ao BindingSource . Em
seguida, você pode usar o método de navegação interno do BindingSource , como
MoveNext, e MoveLastMovePreviousMoveFirst. O uso desses métodos ajustará as
propriedades e Current as Position BindingSource propriedades do apropriadamente.
Você também pode encontrar um registro e defini-lo como o registro atual definindo a
Position propriedade.
C#
7 Observação
O exemplo a seguir ilustra como você pode testar se você atingiu o último elemento de
dados. No exemplo, se você estiver no último elemento, o botão Próximo do formulário
estará desabilitado.
C#
7 Observação
Lembre-se de que, se você alterar a lista que está navegando no código, deverá
habilitar novamente o botão Avançar para que os usuários possam navegar por
todo o comprimento da nova lista. Além disso, lembre-se de que o evento acima
PositionChanged para o específico BindingSource com o qual você está
trabalhando precisa ser associado ao método de tratamento de eventos.
C#
C#
C#
C#
C#
1. Execute o exemplo.
3. Selecione o botão Limpar campo pai para causar uma alteração em um campo da
tabela pai. Observe que a linha selecionada na tabela filho não é alterada.
6. Selecione o botão Limpar campo pai . Observe que a linha selecionada na tabela
filho muda para a primeira linha.
Confira também
Visão geral da vinculação de dados
Fontes de dados compatíveis com Windows Forms
Notificação de alteração na associação de dados do Windows Forms
Como sincronizar vários controles com a mesma fonte de dados
Componente BindingSource
Criar um controle de associação simples
(Windows Forms .NET)
Artigo • 08/02/2023 • 3 minutos para o fim da leitura
Com a associação de dados simples, você pode exibir um único elemento de dados,
como um valor de coluna de uma tabela de conjunto de dados para um controle em um
formulário. Você pode associar de maneira simples qualquer propriedade de um
controle a um valor de dados.
4. Se a propriedade que você deseja associar não for uma das propriedades
comumente associadas, selecione o botão Reticências ( ) na caixa Avançado
para exibir a caixa de diálogo Formatação e Associação Avançada com uma lista
completa de propriedades para esse controle.
7 Observação
Como os controles de associação simples mostram apenas um único
elemento de dados, é comum incluir a lógica de navegação em um
Formulário Windows com controles de associação simples.
5. Expanda a fonte de dados à qual você deseja associar a propriedade até encontrar
o único elemento de dados desejado.
7. Na caixa Formatar tipo , selecione o formato que você deseja aplicar aos dados
exibidos no controle.
Data/Hora Escolha como a data e a hora devem ser exibidas selecionando um dos
itens na caixa de seleção Tipo .
Confira também
Binding
Associação de dados
Validação da entrada do usuário no Windows Forms
Sincronizar vários controles com a
mesma fonte de dados (Windows Forms
.NET)
Artigo • 08/02/2023 • 2 minutos para o fim da leitura
No caso anterior, você pode usar uma BindingSource para associar a fonte de dados aos
controles. No último caso, você usa um BindingSource e manipula o BindingComplete
evento e chama EndCurrentEdit o associado BindingManagerBase.
C#
public Form1()
{
InitializeComponent();
set1.Tables.Add("Menu");
set1.Tables[0].Columns.Add("Beverages");
Confira também
Criar ótimas fontes de dados com notificação de alteração
Associação de dados
Como: Compartilhar dados associados entre formulários usando o componente
BindingSource
Recursos de Windows Forms obsoletos
no .NET 7+
Artigo • 08/02/2023 • 2 minutos para o fim da leitura
A partir do .NET 7, algumas APIs Windows Forms são marcadas como obsoletas (ou
produzem um aviso) com IDs de diagnóstico personalizadas do formato WFDEVXXX .
Se você encontrar avisos ou erros de compilação devido ao uso de uma API obsoleta,
siga as orientações específicas fornecidas para o ID de diagnóstico listado na seção
Referência. Avisos ou erros para essas obsoletas não podem ser suprimidos usando o ID
de diagnóstico padrão (CS0618) para tipos ou membros obsoletos; em vez disso, use os
valores de ID de diagnóstico WFDEVXXX personalizados. Para obter mais informações,
consulte Suprimir avisos.
Referência
A tabela a seguir fornece um índice para as WFDEVXXX obsoletões e avisos no .NET 7+.
ID do Aviso ou Descrição
diagnóstico erro
Suprimir avisos
É recomendável usar uma solução alternativa disponível sempre que possível. No
entanto, se você não puder alterar seu código, poderá suprimir os avisos por meio de
uma diretiva #pragma ou de uma configuração de projeto <NoWarn> . Se você precisar
usar as APIs obsoletas e o diagnóstico WFDEVXXX não aparecer como um erro, você
poderá suprimir o aviso no código ou no arquivo de projeto.
XML
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<!-- NoWarn below suppresses WFDEV001 project-wide -->
<NoWarn>$(NoWarn);WFDEV001</NoWarn>
<!-- To suppress multiple warnings, you can use multiple NoWarn elements
-->
<NoWarn>$(NoWarn);WFDEV001</NoWarn>
<NoWarn>$(NoWarn);WFDEV003</NoWarn>
<!-- Alternatively, you can suppress multiple warnings by using a
semicolon-delimited list -->
<NoWarn>$(NoWarn);WFDEV001;WFDEV003</NoWarn>
</PropertyGroup>
</Project>
7 Observação
Confira também
Recursos obsoletos do .NET no .NET 5+
WFDEV001: WParam, LParam e
Message.Result estão obsoletos
Artigo • 08/02/2023 • 2 minutos para o fim da leitura
Soluções Alternativas
Atualize seu código para usar as novas propriedades internas
WParamInternal LParamInternal ResultInternal ou dependendo da situação.
Suprimir um aviso
Se for necessário usar as APIs obsoletas, você poderá suprimir o aviso no código ou no
arquivo de projeto.
C#
Para suprimir todos os avisos WFDEV001 no projeto, adicione uma propriedade <NoWarn>
ao arquivo de projeto.
XML
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);WFDEV001</NoWarn>
</PropertyGroup>
</Project>
Qualquer referência a
System.Windows.Forms.DomainUpDown.DomainUpDownAccessibleObject resultará em
aviso WFDEV002 . Esse aviso indica que DomainUpDown.DomainUpDownAccessibleObject
não é mais usado para fornecer suporte acessível para DomainUpDown controles. O
DomainUpDown.DomainUpDownAccessibleObject tipo nunca foi destinado ao uso
público.
7 Observação
Esse aviso foi promovido a um erro a partir do .NET 8 e você não pode mais
suprimir o erro. Para obter mais informações, consulte A obsoletão WFDEV002
agora é um erro.
Soluções Alternativas
Atualize seu código para usar AccessibleObject em vez de
DomainUpDown.DomainUpDownAccessibleObject.
Se você estiver usando o .NET 7, poderá suprimir o aviso e seu código continuará a
ser compilado e executado.
C#
Para suprimir todos os avisos WFDEV002 no projeto, adicione uma propriedade <NoWarn>
ao arquivo de projeto.
XML
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);WFDEV002</NoWarn>
</PropertyGroup>
</Project>
mais usado para fornecer suporte acessível para itens em DomainUpDown controles.
Esse tipo nunca foi destinado a uso público.
Soluções Alternativas
Remova invocações do construtor público para o
DomainUpDown.DomainItemAccessibleObject tipo. Use
System.Windows.Forms.AccessibleObject em vez disso.
Suprimir um aviso
Se for necessário usar as APIs obsoletas, você poderá suprimir o aviso no código ou no
arquivo de projeto.
C#
XML
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
...
<NoWarn>$(NoWarn);WFDEV003</NoWarn>
</PropertyGroup>
</Project>