2010-10-15 17 views
7

He estado leyendo sobre las propiedades de Dependencia por unos días y entiendo cómo recuperan el valor en lugar de establecerlo/obtenerlo como en las propiedades de CLR. Siéntete libre de corregirme si estoy equivocado.¿Cómo crear una propiedad Dependency en un control existente?

Desde mi entender todo WPF controla como un TextBlock, botón, etc., que se derivan de DependencyObject también contendría las propiedades de dependencia para guardar sus valores, en lugar de utilizar las propiedades CLR. Esto tiene la ventaja de anular los valores locales en caso de que se utilicen animaciones, o heredar valores si no se establece ningún valor local, etc.

Ahora estoy tratando de encontrar algunas muestras para crear y usar mi propio dp.

1) ¿Es posible crear mi propia propiedad de dependencia en un control WPF existente? Supongamos que me gustaría una propiedad de dependencia de tipo entero en la clase WPF Textblock. ¿O tengo que crear una nueva clase derivada de TextBlockBase para crear allí mi propiedad de dependencia?

2) En cualquier caso, supongamos que he creado una propiedad de dependencia en una clase de bloque de texto WPF. Ahora me gustaría utilizarlo vinculando el contenido de la etiqueta a esa propiedad de dependencia de TextBlock. Para que la etiqueta siempre muestre el valor real de la función dp de TextBlock, sin importar si se hereda o se establece localmente.

Esperemos que alguien me puede ayudar con estos dos ejemplos ... Muchas gracias, Kave

Respuesta

6

Puede utilizar attached properties por ello.

definir su myInt propiedad: contenido de la etiqueta


namespace WpfApplication5 
{ 
    public class MyProperties 
    { 
     public static readonly System.Windows.DependencyProperty MyIntProperty; 

     static MyProperties() 
     { 
      MyIntProperty = System.Windows.DependencyProperty.RegisterAttached(
       "MyInt", typeof(int), typeof(MyProperties)); 
     } 

     public static void SetMyInt(System.Windows.UIElement element, int value) 
     { 
      element.SetValue(MyIntProperty, value); 
     } 

     public static int GetMyInt(System.Windows.UIElement element) 
     { 
      return (int)element.GetValue(MyIntProperty); 
     } 
    } 
} 

unen:


<Window x:Class="WpfApplication5.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication5" 
    Title="Window1" Height="300" Width="300"> 
    <Grid> 
     <Label Margin="98,115,51,119" Content="{Binding Path=(local:MyProperties.MyInt), RelativeSource={x:Static RelativeSource.Self}}" local:MyProperties.MyInt="42"/> 
    </Grid> 
</Window> 
+0

gracias, esta es también una buena alternativa, que voy a estar tratando pronto . – Houman

1

usted no puede añadir a DependencyProperties tipo existente. Si bien puedes usar AttachedProperty, la lógica detrás de usarlo y derivar un nuevo tipo es completamente diferente.

En su caso, recomendaría derivar un nuevo tipo. Principalmente porque su lógica está vinculada a este tipo. Esto es básico detrás de la herencia y no está vinculado con las propiedades de Dependencia.

En caso de propiedad adjunta, solo le está dando a otro objeto una variedad de valores en un objeto diferente. Algo como Grid.Row le está dando a Grid la energía de su hijo y cómo debería posicionarlo. El objeto donde se establece esta propiedad no tiene conocimiento de nada.

+0

gracias. ¿Por qué querría alguna vez crear dp? He leído que algunas personas crean las suyas propias. Me gustaría ver un ejemplo en el que tenga sentido crear tu propio dp ... – Houman

0

Aquí se muestra un ejemplo de un ovveride del elemento Run:

using System; 
using System.Windows; 
using System.Windows.Documents; 

namespace MyNameSpace.FlowDocumentBuilder 
{ 
    public class ModifiedRun : Run 
    { 
     static DateRun() 
     { 
      TextProperty.OverrideMetadata(typeof(DateRun),new FrameworkPropertyMetadata(string.Empty,FrameworkPropertyMetadataOptions.Inherits,null,CoerceValue)); 
     } 

     private static object CoerceValue(DependencyObject d, object basevalue) 
     { 
      return "AAAAAAAA"; 
     } 
    } 
} 

Una el XAML correspondiente es:

<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
         ColumnWidth="400" 
         FontSize="14" 
         FontFamily="Arial" 
xmlns:local="clr-namespace:MyNameSpace.FlowDocumentBuilder;assembly=MyNameSpace.FlowDocumentBuilder" 
> 

<Paragraph><local:ModifiedRun Text="BBBBBBBBBB"/></Paragraph> 

</FlowDocument> 
Cuestiones relacionadas