2013-08-07 6 views
2

Я хочу использовать RoutedEvent на Border в словаре XAML. RoutedEvent происходит от класса, для которого является шаблон, как я могу это достичь?Добавить RoutedEvent через TemplateBinding

ModernWindow.cs

/// <summary> 
/// Gets fired when the logo is clicked. 
/// </summary> 
public static readonly RoutedEvent LogoClickEvent = EventManager.RegisterRoutedEvent("LogoClickRoutedEventHandler", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(ModernWindow)); 

/// <summary> 
/// The routedeventhandler for LogoClick 
/// </summary> 
public event RoutedEventHandler LogoClick 
{ 
    add { AddHandler(LogoClickEvent, value); } 
    remove { RemoveHandler(LogoClickEvent, value); } 
} 

/// <summary> 
/// 
/// </summary> 
protected virtual void OnLogoClick() 
{ 
    RaiseEvent(new RoutedEventArgs(LogoClickEvent, this)); 
} 

ModernWindow.xaml

<!-- logo --> 
<Border MouseLeftButtonDown="{TemplateBinding LogoClick}" Background="{DynamicResource Accent}" Width="36" Height="36" HorizontalAlignment="Right" VerticalAlignment="Top" Margin="0,0,76,0"> 
    <Image Source="{TemplateBinding Logo}" Stretch="UniformToFill" /> 
</Border> 

ответ

2

я нашел, наконец, решение, я использовал InputBindings, а затем Commands.

<Border.InputBindings> 
    <MouseBinding Command="presentation:Commands.LogoClickCommand" Gesture="LeftClick" /> 
</Border.InputBindings> 

Это не то, что я хотел, но это работает :)

1

Я думаю, что в вашей ситуации, вы можете использовать EventSetter, он просто предназначен, чтобы сделать это. Для вас это будет выглядеть примерно так:

<Style TargetType="{x:Type SomeControl}"> 
    <EventSetter Event="Border.MouseLeftButtonDown" Handler="LogoClick" /> 
    ... 

</Style> 

Note:EvenSetter не может быть установлен с помощью триггеров и не могут быть использованы в стиле, который содержится в словаре тема ресурсов, поэтому обычно ставится в начале текущего стиля.

Для получения дополнительной информации см:

EventSetter Class in MSDN

Или, если необходимо использовать его в ResourceDictionary, вы можете сделать это по-другому. Создайте DependencyProperty (также можно прикрепить). Пример с прикрепленными DependencyProperty:

определение недвижимости:

public static readonly DependencyProperty SampleProperty = 
              DependencyProperty.RegisterAttached("Sample", 
              typeof(bool), 
              typeof(SampleClass), 
              new UIPropertyMetadata(false, OnSample)); 

private static void OnSample(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
{ 
    if (e.NewValue is bool && ((bool)e.NewValue) == true) 
    { 
     // do something... 
    } 
} 

Если вы пытаетесь установить значение нашей собственности, называется On Sample, в которой вы будете иметь возможность делать то, что вам нужно (почти так же как мероприятие).

Установить значение свойства, в зависимости от случая, вы могли бы:

<EventTrigger SourceName="MyBorder" RoutedEvent="Border.MouseLeftButtonDown"> 
    <BeginStoryboard> 
     <Storyboard> 
      <ObjectAnimationUsingKeyFrames Storyboard.TargetName="MyBorder" Storyboard.TargetProperty="(local:SampleClass.Sample)"> 
       <DiscreteObjectKeyFrame KeyTime="0:0:0"> 
        <DiscreteObjectKeyFrame.Value> 
         <sys:Boolean>True</sys:Boolean> 
        </DiscreteObjectKeyFrame.Value> 
       </DiscreteObjectKeyFrame> 
      </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
    </BeginStoryboard> 
</EventTrigger> 
+0

Thx, но именно это проблема, мне нужно это в тему Dictionary для пользовательского элемента управления пользователя ... – Knerd

+0

@Knerd: См. Ответ о свойстве зависимостей. –

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

  • Нет связанных вопросов^_^