2009-09-23 2 views
0

На данный момент в Silverlight, , реализованы проекционные реализации, но ни один из них не делает то, что я хочу.Возможно ли создание пользовательских реализаций System.Windows.Media.Projection

Мне нужно что-то вроде класса PlaneProjector, но ему нужно только свойство RotationY, и оно должно поднять событие всякий раз, когда это свойство изменено.

Я не могу создать класс к югу от PlaneProjector, как она запечатана, так что мой единственный оставшийся вариант (я думаю), чтобы создать класс к югу от System.Windows.Media.Projection ... но я могу вряд ли какая-либо информация об этом классе.

Кто-нибудь знает, как реализовать свои собственные проекторы для Silverlight?

Update

Дело в том:

У меня есть анимации, которые изменяют свойства RotationY в PlaneProjection. Одна анимация от 0 до 180 One animation from 180 to 0

Мне нужно уведомить вас обо всех изменениях в RotationY, чтобы я мог правильно обновить интерфейс.

ответ

1

Невозможно создать пользовательскую реализацию Projection.

В чем проблема с классом 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 есть событие, которое будет уведомлять вас о каждом изменении значения. Помогает ли это вам в достижении того, что вы пытаетесь сделать?

+0

Можете ли вы привести пример того, что вы имеете в виду ... потому что я должен упустить что-то очень тривиальное здесь. (добавит больше деталей на вопрос) – TimothyP

+1

Я обновил ответ с помощью некоторого кода. – KeithMahoney

Смежные вопросы