2012-05-19 12 views
10

क्यों IsMouseOver को एक WPF स्टाइल ट्रिगर के रूप में पहचाना जाता है और माउसडाउन यह नहीं है कि दोनों वैध UIElement गुण seen here के रूप में हैं -। पहला ट्रिगर अच्छी तरह से काम करता है लेकिन दूसरा एक संकलन भी नहीं करता है।क्यों IsMouseOver मान्यता प्राप्त है और MouseDown नहीं है (Wpf स्टाइल ट्रिगर)?

<Style.Triggers> 
    <Trigger Property="IsMouseOver" Value="true"> 
     <Setter Property="OpacityMask"> 
      <Setter.Value> 
       <LinearGradientBrush > 
        <GradientStop Color="Transparent" Offset="0"/> 
        <GradientStop Color="Black" Offset="0.5"/> 
        <GradientStop Color="Transparent" Offset="1"/> 
       </LinearGradientBrush> 
      </Setter.Value> 
     </Setter> 
    </Trigger> 
    <Trigger Property="MouseDown" Value="true"> 
     <Setter Property="OpacityMask"> 
      <Setter.Value> 
       <LinearGradientBrush> 
        <GradientStop Color="Black" Offset="0" /> 
        <GradientStop Color="White" Offset="1" /> 
       </LinearGradientBrush> 
      </Setter.Value> 
     </Setter> 
    </Trigger> 
</Style.Triggers> 
+1

पता नहीं है, लेकिन 'MouseDown' एक के रूप में सूचीबद्ध नहीं है, आपके द्वारा प्रदान किए गए लिंक पर संपत्ति। 'OnMouseDown() 'किसी ईवेंट के जवाब में बुलाए गए विधि के रूप में सूचीबद्ध है, लेकिन संपत्ति नहीं है। –

उत्तर

15

ठीक है, मुझे लगता है कि आप संपत्ति के लिए MouseDown ईवेंट गलत कर रहे हैं। IsMouseDown संपत्ति नहीं है लेकिन IsPressed संपत्ति समान है लेकिन केवल ButtonBase विरासत में कक्षाओं के लिए मौजूद है। यदि आप अपना कोड-पीछे साफ रखना चाहते हैं तो आपको केवल कोड-पीछे में ईवेंट का उपयोग करना चाहिए या संलग्न संपत्ति लिखना चाहिए।

यह है कि आप इसे कैसे करते हैं। बनाएं वर्ग:

using System; 
using System.Windows; 

namespace Mrpyo 
{ 
    public static class MouseDownHelper 
    { 
     public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached("IsEnabled", 
     typeof(bool), typeof(MouseDownHelper), new FrameworkPropertyMetadata(false, new PropertyChangedCallback(OnNotifyPropertyChanged))); 

     public static void SetIsEnabled(UIElement element, bool value) 
     { 
      element.SetValue(IsEnabledProperty, value); 
     } 

     public static bool GetIsEnabled(UIElement element) 
     { 
      return (bool)element.GetValue(IsEnabledProperty); 
     } 

     private static void OnNotifyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      var element = d as UIElement; 
      if (element != null && e.NewValue != null) 
      { 
       if ((bool)e.NewValue) 
       { 
        Register(element); 
       } 
       else 
       { 
        UnRegister(element); 
       } 
      } 
     } 

     private static void Register(UIElement element) 
     { 
      element.PreviewMouseDown += element_MouseDown; 
      element.PreviewMouseLeftButtonDown += element_MouseLeftButtonDown; 
      element.MouseLeave += element_MouseLeave; 
      element.PreviewMouseUp += element_MouseUp; 
     } 

     private static void UnRegister(UIElement element) 
     { 
      element.PreviewMouseDown -= element_MouseDown; 
      element.PreviewMouseLeftButtonDown -= element_MouseLeftButtonDown; 
      element.MouseLeave -= element_MouseLeave; 
      element.PreviewMouseUp -= element_MouseUp; 
     } 

     private static void element_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      var element = e.Source as UIElement; 
      if (element != null) 
      { 
       SetIsMouseDown(element, true); 
      } 
     } 

     private static void element_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      var element = e.Source as UIElement; 
      if (element != null) 
      { 
       SetIsMouseLeftButtonDown(element, true); 
      } 
     } 

     private static void element_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e) 
     { 
      var element = e.Source as UIElement; 
      if (element != null) 
      { 
       SetIsMouseDown(element, false); 
       SetIsMouseLeftButtonDown(element, false); 
      } 
     } 

     private static void element_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e) 
     { 
      var element = e.Source as UIElement; 
      if (element != null) 
      { 
       SetIsMouseDown(element, false); 
       SetIsMouseLeftButtonDown(element, false); 
      } 
     } 

     internal static readonly DependencyPropertyKey IsMouseDownPropertyKey = DependencyProperty.RegisterAttachedReadOnly("IsMouseDown", 
     typeof(bool), typeof(MouseDownHelper), new FrameworkPropertyMetadata(false)); 
     public static readonly DependencyProperty IsMouseDownProperty = IsMouseDownPropertyKey.DependencyProperty; 

     internal static void SetIsMouseDown(UIElement element, bool value) 
     { 
      element.SetValue(IsMouseDownPropertyKey, value); 
     } 

     public static bool GetIsMouseDown(UIElement element) 
     { 
      return (bool)element.GetValue(IsMouseDownProperty); 
     } 

     internal static readonly DependencyPropertyKey IsMouseLeftButtonDownPropertyKey = DependencyProperty.RegisterAttachedReadOnly("IsMouseLeftButtonDown", 
     typeof(bool), typeof(MouseDownHelper), new FrameworkPropertyMetadata(false)); 
     public static readonly DependencyProperty IsMouseLeftButtonDownProperty = IsMouseLeftButtonDownPropertyKey.DependencyProperty; 

     internal static void SetIsMouseLeftButtonDown(UIElement element, bool value) 
     { 
      element.SetValue(IsMouseLeftButtonDownPropertyKey, value); 
     } 

     public static bool GetIsMouseLeftButtonDown(UIElement element) 
     { 
      return (bool)element.GetValue(IsMouseLeftButtonDownProperty); 
     } 
    } 
} 
फिर अपने शैली में

:

<Setter Property="local:MouseDownHelper.IsEnabled" Value="True"/> 
<Style.Triggers> 
    <Trigger Property="local:MouseDownHelper.IsMouseLeftButtonDown" Value="True"> 
     <!-- ... --> 
    </Trigger> 
</Style.Triggers> 

और निश्चित रूप से अपने XAML फाइल में नाम स्थान जोड़ने (शीर्ष पर देखें):

xmlns:local="clr-namespace:Mrpyo" 
+0

क्या आप "संलग्न संपत्ति लिखने" के साथ बात कर रहे हैं इसका एक उदाहरण प्रदान कर सकते हैं? –

+0

मैं सिर्फ आपके लिए कक्षा लिख ​​रहा हूं;)। लेकिन आपको एक पल के लिए इंतजार करना होगा ... – mrpyo

+0

इस कक्षा के लिए बहुत बहुत धन्यवाद। मुझे इसे काम करने के लिए पूर्वावलोकनमाउसडाउन और पूर्वावलोकनमोउसअप ईवेंट का उपयोग करना पड़ा, लेकिन उसके बाद यह शानदार था। बटन 'Ispressed' –

2

आप में MouseDown Event उपयोग कर सकते हैं Style.Triggers लेकिन इसके लिए आपको EventTrigger का उपयोग करना होगा।

<EventTrigger RoutedEvent="MouseEnter"> 
    <BeginStoryboard> 
     <Storyboard> 
      ... 
     </Storyboard> 
    </BeginStoryboard> 
</EventTrigger> 

और याद रखें

कि कार्रवाई को वापस नहीं किया जाएगा एक बार शर्त यह है कि घटना उठाया अब सच है।

0

जब Control.Triggers का उपयोग कर, नियंत्रण आइटम टेम्पलेट में इस्तेमाल किया जा रहा है के साथ नियंत्रण की जगह आप PreviewMouseLeftButtonDown इस्तेमाल कर सकते हैं:

<Grid> 
    <Grid.Triggers> 
    <EventTrigger RoutedEvent="Grid.PreviewMouseLeftButtonDown"> 
     <BeginStoryboard> 
     <Storyboard> 
      ... 
     </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
    </Grid.Triggers> 
</Grid> 
संबंधित मुद्दे