2009-03-31 7 views
15

¿Hay alguna manera de detectar un cambio en la propiedad Text de un elemento TextBlock usando eventos?¿Cómo detectar un cambio en la propiedad Text de un TextBlock?

(estoy tratando de proporcionar una animación para poner de relieve las TextBlocks cuyo cambio de propiedad de texto dentro de una cuadrícula de datos)

+0

Tome un vistazo a esto: http://stackoverflow.com/a/2964694/2550529 – SepehrM

Respuesta

3

Por lo que yo puedo entender que no hay ningún evento en TextChanged TextBlock. En cuanto a sus requisitos, creo que volver a diseñar un cuadro de texto tampoco será una solución viable. Desde mi búsqueda preliminar, this parece ser una posible solución.

+0

Eso es exactamente lo que quería hacer. Muchas gracias. –

7

Esto es desde el enlace de respuesta bioskope, pero simplied.

<TextBlock Text="{Binding YourTextProperty, NotifyOnTargetUpdated=True}" 
      TargetUpdated="YourTextEventHandler"/> 
+1

Al usar el código detrás del evento, en mi opinión, esta debería ser la respuesta correcta. –

1

enlaza la propiedad de texto a un DependencyProperty, que tiene un disparador de evento:

public static string GetTextBoxText(DependencyObject obj) 
{ 
    return (string)obj.GetValue(TextBoxTextProperty); 
} 

public static void SetTextBoxText(DependencyObject obj, string value) 
{ 
    obj.SetValue(TextBoxTextProperty, value); 
} 

public static readonly DependencyProperty TextBoxTextProperty = 
    DependencyProperty.RegisterAttached(
    "TextBoxText", 
    typeof(string), 
    typeof(TextBlockToolTipBehavior), 
    new FrameworkPropertyMetadata(string.Empty, TextBoxTextChangedCallback) 
    ); 

private static void TextBoxTextChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    TextBlock textBlock = d as TextBlock; 
    HandleTextChange(textBlock); 
} 

En el XAML se unen a la propiedad de texto TextBlock:

<TextBlock 
Text="{Binding SomeProperty, UpdateSourceTrigger=PropertyChanged}" 
    th:TextBlockBehavior.TextBoxText="{Binding Text, 
    RelativeSource={RelativeSource Self}}" /> 
0

Aquí hay algo que se puede utilizar Recogí de Jerry Nixon y Daren May en la Academia Virtual de Microsoft "Developing Universal Windows Apps with C# and XAML" y el código que contiene la lógica de DependencyObject está aquí "(W8.1-WP8.1) UNIVERSAL APP FOR MVA".

namespace App1.Behaviors 
{ 
// <summary> 
/// Helper class that allows you to monitor a property corresponding to a dependency property 
/// on some object for changes and have an event raised from 
/// the instance of this helper that you can handle. 
/// Usage: Construct an instance, passing in the object and the name of the normal .NET property that 
/// wraps a DependencyProperty, then subscribe to the PropertyChanged event on this helper instance. 
/// Your subscriber will be called whenever the source DependencyProperty changes. 
/// </summary> 
public class DependencyPropertyChangedHelper : DependencyObject 
{ 
    /// <summary> 
    /// Constructor for the helper. 
    /// </summary> 
    /// <param name="source">Source object that exposes the DependencyProperty you wish to monitor.</param> 
    /// <param name="propertyPath">The name of the property on that object that you want to monitor.</param> 
    public DependencyPropertyChangedHelper(DependencyObject source, string propertyPath) 
    { 
     // Set up a binding that flows changes from the source DependencyProperty through to a DP contained by this helper 
     Binding binding = new Binding 
     { 
      Source = source, 
      Path = new PropertyPath(propertyPath) 
     }; 
     BindingOperations.SetBinding(this, HelperProperty, binding); 
    } 

    /// <summary> 
    /// Dependency property that is used to hook property change events when an internal binding causes its value to change. 
    /// This is only public because the DependencyProperty syntax requires it to be, do not use this property directly in your code. 
    /// </summary> 
    public static DependencyProperty HelperProperty = 
     DependencyProperty.Register("Helper", typeof(object), typeof(DependencyPropertyChangedHelper), new PropertyMetadata(null, OnPropertyChanged)); 

    /// <summary> 
    /// Wrapper property for a helper DependencyProperty used by this class. Only public because the DependencyProperty syntax requires it. 
    /// DO NOT use this property directly. 
    /// </summary> 
    public object Helper 
    { 
     get { return (object)GetValue(HelperProperty); } 
     set { SetValue(HelperProperty, value); } 
    } 

    // When our dependency property gets set by the binding, trigger the property changed event that the user of this helper can subscribe to 
    private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var helper = (DependencyPropertyChangedHelper)d; 
     helper.PropertyChanged(d, e); 
    } 

    /// <summary> 
    /// This event will be raised whenever the source object property changes, and carries along the before and after values 
    /// </summary> 
    public event EventHandler<DependencyPropertyChangedEventArgs> PropertyChanged = delegate { }; 
} 
} 

Uso XAML:

<TextBlock Grid.Row="0" 
     x:Name="WritingMenuTitle" 
     HorizontalAlignment="Left" 
     FontSize="32" 
     FontWeight="SemiBold" 
     Text="{Binding WritingMenu.Title}" 
     TextAlignment="Left" 
     TextWrapping="Wrap"/> 

xaml.cs de uso:

Behaviors.DependencyPropertyChangedHelper helper = new Behaviors.DependencyPropertyChangedHelper(this.WritingMenuTitle, Models.CommonNames.TextBlockText); 
helper.PropertyChanged += viewModel.OnSenarioTextBlockTextChangedEvent; 

viewmodel.cs de uso:

public async void OnSenarioTextBlockTextChangedEvent(object sender, DependencyPropertyChangedEventArgs args) 
{ 
StringBuilder sMsg = new StringBuilder(); 

try 
{ 
    Debug.WriteLine(String.Format(".....WritingMenuTitle : New ({0}), Old ({1})", args.NewValue, args.OldValue)); 
} 
catch (Exception msg) 
{ 
    #region Exception 
    ..... 
    #endregion 
} 
} 
16

Su más fácil de lo que lol. Respuesta tardía, pero mucho más simple.

// assume textBlock is your TextBlock 
DependencyPropertyDescriptor dp = DependencyPropertyDescriptor.FromProperty(TextBlock.TextProperty, typeof(TextBlock)); 

dp.AddValueChanged(textBlock, (object a, EventArgs b) => 
{ 
     MessageBox.Show("text changed"); 
}); 
+1

¿Dónde está poniendo dp.AddValueChanged? – wbt11a

+1

cargado o constructor sonaría como un buen lugar. –

Cuestiones relacionadas