DependencyObject Classe
Definição
Importante
Algumas informações se referem a produtos de pré-lançamento que podem ser substancialmente modificados antes do lançamento. A Microsoft não oferece garantias, expressas ou implícitas, das informações aqui fornecidas.
Representa um objeto que participa do sistema de propriedades de dependência.
public ref class DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public class DependencyObject
Public Class DependencyObject
- Herança
- Derivado
- Atributos
Exemplos
Este exemplo define uma classe da DependencyObjectqual deriva e define uma propriedade anexada junto com o campo identificador. O cenário para essa classe é que é uma classe de serviço que declara uma propriedade anexada que outros elementos de interface do usuário podem definir em XAML O serviço potencialmente atua nos valores da propriedade anexada nesses elementos de interface do usuário em tempo de execução.
public abstract class AquariumServices : DependencyObject
{
public enum Buoyancy { Floats, Sinks, Drifts }
public static readonly DependencyProperty BuoyancyProperty = DependencyProperty.RegisterAttached(
"Buoyancy",
typeof(Buoyancy),
typeof(AquariumServices),
new PropertyMetadata(Buoyancy.Floats)
);
public static void SetBuoyancy(DependencyObject element, Buoyancy value)
{
element.SetValue(BuoyancyProperty, value);
}
public static Buoyancy GetBuoyancy(DependencyObject element)
{
return (Buoyancy)element.GetValue(BuoyancyProperty);
}
}
public static bool ClearSetProperty(DependencyObject targetObject, DependencyProperty targetDP)
{
if (targetObject == null || targetDP == null)
{
throw new ArgumentNullException();
}
object localValue = targetObject.ReadLocalValue(targetDP);
if (localValue == DependencyProperty.UnsetValue)
{
return false;
}
else
{
targetObject.ClearValue(targetDP);
return true;
}
}
Este exemplo mostra uma declaração de propriedade de dependência simples. Uma chamada para GetValue constitui a totalidade da implementação do get acessador para o wrapper de propriedade da nova propriedade de dependência. Uma chamada para SetValue constitui a totalidade da implementação do set acessador. Para obter mais exemplos, consulte propriedades de dependência personalizadas.
public class Fish : Control
{
public static readonly DependencyProperty SpeciesProperty =
DependencyProperty.Register(
"Species",
typeof(String),
typeof(Fish), null
);
public string Species
{
get { return (string)GetValue(SpeciesProperty); }
set { SetValue(SpeciesProperty, (string)value); }
}
}
Comentários
A DependencyObject classe permite serviços do sistema de propriedades de dependência em suas muitas classes derivadas e é a classe base imediata de muitas classes importantes relacionadas à interface do usuário, como UIElement, Geometry, FrameworkTemplate, Style e ResourceDictionary. Para obter mais informações sobre como dá DependencyObject suporte a propriedades de dependência, consulte a visão geral das propriedades de dependência.
A função primária do sistema de propriedades de dependência é calcular os valores das propriedades e fornecer notificação do sistema sobre valores que foram alterados. Outra classe chave que participa do sistema de propriedades de dependência é DependencyProperty.
DependencyProperty permite o registro de propriedades de dependência no sistema de propriedades, enquanto DependencyObject como uma classe base permite que os objetos usem e defina as propriedades de dependência.
Aqui estão alguns serviços e características notáveis que DependencyObject fornece ou dá suporte:
- Suporte à hospedagem de propriedade de dependência para as propriedades de dependência de Windows Runtime existentes.
- Suporte à hospedagem de propriedade de dependência personalizada. Você registra uma propriedade de dependência chamando o método Register e armazenando o valor retornado do método como uma propriedade estática pública em sua
DependencyObjectclasse. - Suporte à hospedagem de propriedade anexada para as propriedades anexadas Windows Runtime existentes.
- Suporte personalizado de hospedagem de propriedade anexada. Registre uma propriedade de dependência para o uso da propriedade anexada chamando o método RegisterAttached e armazenando o valor retornado do método como uma propriedade estática pública em sua classe.
-
GeteSetmétodos utilitários para valores de quaisquer propriedades de dependência que existam em umDependencyObject. Você os usa ao definir wrappers de propriedade de dependência personalizados e também pode usá-los do código do aplicativo como uma alternativa ao uso de propriedades de wrapper existentes. - Utilitário de cenário avançado para examinar metadados ou valores de propriedade (por exemplo , GetAnimationBaseValue).
- Imposição de afinidade de thread ao thread principal da interface do usuário do Windows Runtime para todas as
DependencyObjectinstâncias. - A propriedade DispatcherQueue para cenários avançados de threading. Permite
DispatcherQueueque um thread de trabalho execute o código que usa umDependencyObjectthread de interface do usuário, mas não está no thread da interface do usuário, pois ele pode adiar a execução para uma operação assíncrona que não bloqueará ou interferirá no thread da interface do usuário. Consulte a seção "DependencyObjecte threading" abaixo. - Suporte básico de associação e estilo de dados, permitindo que as propriedades sejam definidas como expressões a serem avaliadas posteriormente no tempo de vida de um objeto. Esses conceitos são explicados com mais detalhes na visão geral das propriedades de dependência. Veja também a associação de dados detalhadamente.
DependencyObject e encadeamento
Todas as DependencyObject instâncias devem ser criadas no thread de interface do usuário associado à janela atual de um aplicativo. Isso é imposto pelo sistema e há duas implicações importantes para o código:
- O código que usa a API de duas
DependencyObjectinstâncias sempre será executado no mesmo thread, que é sempre o thread da interface do usuário. Normalmente, você não tem problemas de threading neste cenário. - O código que não está em execução no thread principal da interface do usuário não pode acessar diretamente
DependencyObjectporque umDependencyObjectthread tem afinidade de thread somente com o thread da interface do usuário. Somente o código executado no thread da interface do usuário pode alterar ou até mesmo ler o valor de uma propriedade de dependência. Por exemplo, um thread de trabalho que você iniciou com uma Tarefa .NET ou um thread ThreadPool explícito não será capaz de ler propriedades de dependência ou chamar outras APIs.
Você não está completamente impedido de usar um DependencyObject thread de trabalho. Mas você deve obter um objeto DispatcherQueue (o valor de DependencyObject.DispatcherQueue) de um DependencyObject para atravessar a separação deliberada entre o thread da interface do usuário do aplicativo e quaisquer outros threads em execução no sistema. Expõe DispatcherQueue o método TryEnqueue para executar seu código aguardável. Como está habilitando o acesso entre threads, DependencyObject.DispatcherQueue é a única API de instância ou DependencyObject qualquer uma de suas subclasses que pode ser acessada de um thread que não seja de interface do usuário sem gerar uma exceção entre threads. Todas as outras DependencyObject APIs geram uma exceção se você tentar chamá-las de um thread de trabalho ou de qualquer outro thread que não seja da interface do usuário.
Os problemas de threading geralmente podem ser evitados no código de interface do usuário típico. No entanto, os dispositivos geralmente não são associados ao thread da interface do usuário. Se você estiver usando informações obtidas de um dispositivo para atualizar a interface do usuário em tempo real, geralmente deverá obter uma DispatcherQueue para que você possa atualizar a interface do usuário. Os serviços são outro caso em que o código usado para acessar o serviço pode não estar em execução no thread da interface do usuário.
Um cenário de código em que você poderá encontrar DependencyObjectproblemas de threading relacionados se estiver definindo seus próprios DependencyObject tipos e tentar usá-los para fontes de dados ou outros cenários em que um DependencyObject não é necessariamente apropriado (porque o objeto não está diretamente relacionado à interface do usuário). Por exemplo, você pode estar tentando otimizações de perf com threads em segundo plano ou outros threads de trabalho que estão alterando valores dos objetos antes da apresentação ou em resposta a um dispositivo, serviço ou outra entrada externa. Avalie se você realmente precisa de propriedades de dependência para seu cenário; talvez as propriedades padrão sejam adequadas.
Classes derivadas de DependencyObject
DependencyObject é a classe pai de várias classes derivadas imediatamente que são fundamentais para o modelo de programação que você usa para seu aplicativo e sua interface do usuário XAML. Aqui estão algumas das classes derivadas notáveis:
- UIElement: a classe base para a maioria dos objetos visuais que podem processar a entrada na interface do usuário. FrameworkElement está mais nessa hierarquia, assim como Control, portanto, há centenas de controles e outras classes no Windows Runtime que todos têm a classe UIElement em suas hierarquias de classe.
- Classes de suporte ao sistema de estilo XAML: FrameworkTemplate (pai de ControlTemplate, DataTemplate, ItemsPanelTemplate), Style, SetterBase (pai de Setter), ToolTipTemplateSettings e outros TemplateSettings.
- Modelo de estado visual: Transição, VisualState, VisualStateGroup, VisualStateManager, VisualTransition.
- Suporte à associação de dados: BindingBase (pai de Binding), CollectionViewSource, PropertyPath, RelativeSource.
- Animações de storyboard: Linha do tempo (pai de Storyboard, animações digitadas, animações de tema), keyframes digitados (como ColorKeyFrame), KeySpline, EasingFunctionBase.
- Elementos gráficos XAML e primitivos de renderização: Brush, Geometry, GeneralTransform, GradientStop, PathFigure, PathSegment, Projection.
- Interoperabilidade de superfície de geração e renderização: ImageSource (pai de BitmapSource, RenderTargetBitmap, SurfaceImageSource e outros).
- Janela: representa a janela principal do aplicativo.
- FlyoutBase (pai de Flyout e MenuFlyout).
- ResourceDictionary: define os recursos chaveados no XAML.
- TextElement: pai de Block e Inline, eles, por sua vez, são classes base para elementos de texto usados para o conteúdo textblock ou os elementos de rich text.
- AutomationPeer: classe base para Microsoft Automação da Interface do Usuário pares que representam controles XAML para um ouvinte Microsoft Automação da Interface do Usuário. Além disso, IRawElementProviderSimple.
- Diversos: CacheMode, ColumnDefinition, DependencyObjectCollection, InputScope, InputScopeName, PageStackEntry, PrintDocument, RowDefinition, TriggerAction, TriggerBase.
Construtores
| Nome | Description |
|---|---|
| DependencyObject() |
Fornece o comportamento de inicialização de classe base para classes derivadas dependencyObject . |
Propriedades
| Nome | Description |
|---|---|
| Dispatcher |
Sempre retorna |
| DispatcherQueue |
Obtém o |
Métodos
| Nome | Description |
|---|---|
| ClearValue(DependencyProperty) |
Limpa o valor local de uma propriedade de dependência. |
| GetAnimationBaseValue(DependencyProperty) |
Retorna qualquer valor base estabelecido para uma propriedade de dependência, que se aplicaria em casos em que uma animação não está ativa. |
| GetValue(DependencyProperty) |
Retorna o valor efetivo atual de uma propriedade de dependência de um DependencyObject. |
| ReadLocalValue(DependencyProperty) |
Retorna o valor local de uma propriedade de dependência, se um valor local for definido. |
| RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
Registra uma função de notificação para escutar alterações em um DependencyProperty específico nesta instância dependencyObject . |
| SetValue(DependencyProperty, Object) |
Define o valor local de uma propriedade de dependência em um DependencyObject. |
| UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
Cancela uma notificação de alteração que foi registrada anteriormente chamando RegisterPropertyChangedCallback. |