是否可以创建System.Windows.Media.Projection的自定义实现

时间:2009-09-23 21:00:36

标签: c# .net silverlight

此时在Silverlight中提供了2个投影实现, 但他们都没有真正做我想做的事。

我需要类似PlaneProjector类的东西但是 它只需要一个RotationY属性,它应该引发一个事件 每当这个属性改变时。

我无法从PlaneProjector创建子类,因为它是密封的, 所以我唯一剩下的选择(我认为)是从中创建一个子类 System.Windows.Media.Projection ...但我几乎没有关于这个类的任何信息。

有人知道如何为Silverlight实现自己的自定义投影仪吗?

更新

事情是:

我有动画可以改变PlaneProjection的RotationY属性。 一个动画从0到180 一个动画从180到0

我需要收到有关RotationY的每次更改的通知,以便我可以正确更新UI。

1 个答案:

答案 0 :(得分:1)

无法创建投影的自定义实现。

PlaneProjection类有什么问题?如果唯一的问题是当属性发生变化时缺少事件,请不要忘记您可以数据绑定到这些属性并以这种方式获取通知。

这是一种可能性。您可以为与RotationY属性绑定数据的代理值设置动画,而不是直接为RotationY属性设置动画。以下是您可以使用的示例类:

public class ValueProxy : FrameworkElement
{
    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(object), typeof(ValueProxy), new PropertyMetadata(OnPropertyChanged));

    public object Value
    {
        get { return GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        ValueProxy obj = (ValueProxy)d;
        if (obj.PropertyChanged != null)
        {
            obj.PropertyChanged(obj, null);
        }
    }

    public event EventHandler PropertyChanged;
}

此类有一个事件,只要“Value”属性发生更改,就会触发该事件。现在你可以在Xaml中使用它,如下所示:

<Grid x:Name="LayoutRoot" >
    <Grid.Resources>
        <Storyboard x:Name="sb1">
            <DoubleAnimation Storyboard.TargetName="valueProxy" Storyboard.TargetProperty="Value" From="0" To="180" FillBehavior="Stop" />
        </Storyboard>
        <c:ValueProxy x:Name="valueProxy" Value="{Binding RotationY, ElementName=pp, Mode=TwoWay}" PropertyChanged="ValueProxy_PropertyChanged" />
    </Grid.Resources>

    <Button Content="Play Animation" Width="200" Height="200" Click="Button_Click" >
        <Button.Projection>
            <PlaneProjection x:Name="pp" RotationY="0" />
        </Button.Projection>
    </Button>
</Grid>

请注意,动画的目标是ValueProxy对象,而不是PlaneProjection。 ValueProxy上有一个事件会在值发生变化时通知您。这有助于您实现您的目标吗?