代码之家  ›  专栏  ›  技术社区  ›  TimothyP

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

  •  0
  • TimothyP  · 技术社区  · 15 年前

    此时,Silverlight中提供了2个投影实现,

    我需要像飞机放映机这样的课程,但是 它只需要一个RotationY属性,并且应该引发一个事件 无论何时更改此属性。

    我无法从PlaneProjector创建子类,因为它是密封的, 所以我唯一剩下的选择(我认为)是从 系统。Windows。媒体。投影。。。但我几乎找不到任何关于这门课的信息。

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

    更新

    问题是:

    我有改变平面投影旋转属性的动画。 从180到0的一个动画

    我需要在RotationY的每一次更改中都得到通知,这样我才能正确地更新UI。

    1 回复  |  直到 15 年前
        1
  •  1
  •   KeithMahoney    15 年前

    这里有一种可能性。可以为绑定到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;
    }
    

    <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>