12

我有一个继承自(你猜对了)Control 的控件。FontSize我想在orStyle属性更改时收到通知。在 WPF 中,我会通过调用DependencyProperty.OverrideMetadata(). 当然,像这样有用的东西在 Silverlight 中没有位置。那么,一个人怎么会收到这些通知呢?

4

5 回答 5

16

我认为这是一个更好的方法。还是需要看利弊。

 /// Listen for change of the dependency property
    public void RegisterForNotification(string propertyName, FrameworkElement element, PropertyChangedCallback callback)
    {

        //Bind to a depedency property
        Binding b = new Binding(propertyName) { Source = element };
        var prop = System.Windows.DependencyProperty.RegisterAttached(
            "ListenAttached"+propertyName,
            typeof(object),
            typeof(UserControl),
            new System.Windows.PropertyMetadata(callback));

        element.SetBinding(prop, b);
    }

现在,您可以调用 RegisterForNotification 来注册元素属性的更改通知,例如 .

RegisterForNotification("Text", this.txtMain,(d,e)=>MessageBox.Show("Text changed"));
RegisterForNotification("Value", this.sliderMain, (d, e) => MessageBox.Show("Value changed"));

在同一http://amazedsaint.blogspot.com/2009/12/silverlight-listening-to-dependency.html上查看我的帖子

使用 Silverlight 4.0 测试版。

于 2009-12-02T19:00:13.517 回答
6

这是一个相当恶心的 hack,但您可以使用双向绑定来模拟这一点。

即有类似的东西:

public class FontSizeListener {
    public double FontSize {
        get { return fontSize; }
        set { fontSize = value; OnFontSizeChanged (this, EventArgs.Empty); }
    }

    public event EventHandler FontSizeChanged;

    void OnFontSizeChanged (object sender, EventArgs e) {
      if (FontSizeChanged != null) FontSizeChanged (sender, e);
    }
}

然后创建绑定,如:

<Canvas>
  <Canvas.Resources>
     <FontSizeListener x:Key="listener" />
  </Canvas.Resources>

  <MyControlSubclass FontSize="{Binding Mode=TwoWay, Source={StaticResource listener}, Path=FontSize}" />
</Canvas>

然后在您的控件子类中连接到侦听器的事件。

于 2009-09-08T23:28:55.183 回答
0

您不能从外部收听依赖属性更改通知。

您可以使用以下代码行访问依赖属性元数据:

PropertyMetadata metaData = Control.ActualHeightProperty.GetMetadata(typeof(Control));

但是,唯一公开的公共成员是“DefaultValue”。

在 WPF 中有多种方法可以做到这一点。但 Silverlight 2 或 3 目前不支持它们。

于 2009-05-07T23:21:29.287 回答
0

我看到的唯一解决方案是听 LayoutUpdated 事件 - 是的,我知道它被调用了很多。但是请注意,在某些情况下,即使 FontSize 或 Style 已更改,它也不会被调用。

于 2009-05-08T03:04:44.010 回答
-3

这是我一直使用的(虽然没有在 SL 上测试过,只是在 WPF 上测试过):

    /// <summary>
    /// This method registers a callback on a dependency object to be called
    /// when the value of the DP changes.
    /// </summary>
    /// <param name="owner">The owning object.</param>
    /// <param name="property">The DependencyProperty to watch.</param>
    /// <param name="handler">The action to call out when the DP changes.</param>
    public static void RegisterDepPropCallback(object owner, DependencyProperty property, EventHandler handler)
    {
        // FIXME: We could implement this as an extension, but let's not get
        // too Ruby-like
        var dpd = DependencyPropertyDescriptor.FromProperty(property, owner.GetType());
        dpd.AddValueChanged(owner, handler);
    }
于 2009-05-07T14:46:04.720 回答