2013-10-16 36 views
5

我有一個網格,當用鼠標懸停時,它的一個子元素變成了生命(不透明度從0到1),但那個網格也可以被丟棄(網格是可通過網格上的關閉按鈕移除的列表框的一部分)。Block MouseLeave觸發器,如果​​對象被丟棄

當用戶單擊刪除按鈕時,它也會啓動MouseLeave事件,當鼠標離開該事件時,該事件當然無法再找到我的DockStackPanel控件了。我該如何解決這個問題?

 <Grid.Triggers> 
     <EventTrigger RoutedEvent="UIElement.MouseEnter"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation Duration="0:0:0.5" Storyboard.TargetName="DockStackPanel" Storyboard.TargetProperty="Opacity" To="1" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
     <EventTrigger RoutedEvent="UIElement.MouseLeave"> 
      <BeginStoryboard> 
       <Storyboard> 
        <DoubleAnimation Duration="0:0:0.5" Storyboard.TargetName="DockStackPanel" Storyboard.TargetProperty="Opacity" To="0" /> 
       </Storyboard> 
      </BeginStoryboard> 
     </EventTrigger> 
    </Grid.Triggers> 
+1

你將需要發佈更多的代碼負責人。 –

回答

2

您是否嘗試過在代碼中創建動畫代替。我在這裏假設DockStackPanel控件是一個StackPanel。

public MainWindow() 
    { 
     InitializeComponent(); 

     MyGrid.MouseEnter += MyGrid_MouseEnter; 
     MyGrid.MouseLeave += MyGrid_MouseLeave; 
    } 

    void MyGrid_MouseLeave(object sender, MouseEventArgs e) 
    { 
     if (DockStackPanel != null) 
     { 
      var dur = new Duration(new TimeSpan(0, 0, 0, 0, 500)); 
      var anim = new DoubleAnimation(0, dur); 
      DockStackPanel.BeginAnimation(StackPanel.OpacityProperty, anim); 
     } 
    } 

    void MyGrid_MouseEnter(object sender, MouseEventArgs e) 
    { 
     var dur = new Duration(new TimeSpan(0, 0, 0, 0, 500)); 
     var anim = new DoubleAnimation(1, dur); 
     DockStackPanel.BeginAnimation(StackPanel.OpacityProperty, anim); 
    } 
+0

爲了避免背後的代碼,我在跳躍,但它似乎是最好的解決方案,所以謝謝! – touyets

+0

沒問題,很樂意幫忙 – snacky

1

另一件事,你能做的就是實現DataTriggerGrid這將覆蓋默認MouseLeaveMouseEnter事件時DisableTriggers屬性更改什麼也不做。

<Style TargetType="{x:Type Grid}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding DisableTriggers}" Value="True"> 
      <Setter Property="Style" Value="{StaticResource GridStyleWithoutStoryboards}" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

這種情況,當你不想使用AttachedBehaviors。否則,我建議在行爲中處理故事板清理。這是很容易:

void OnDisableTriggersPropertyChanged(object sender, EventArgs args) 
{ 
    // If IsDisposed property was changed and it is true now - cleanup triggers. 
    if ((bool)args.NewValue) 
    { 
     var grid = (Grid)sender; 

     // Ideally you can remove specific triggers. 
     // Clear all will work for simple cases. 
     grid.Triggers.Clear(); 
    } 
} 

所以總結你將不得不增加與在OnChanged處理程序執行清理行動DisableTriggers依賴屬性附加的行爲。

如果你希望只從特定事件退訂:

foreach (var eventToUnsubscribe in grid.Triggers.OfType<EventTrigger>() 
                .Where(x => x.RoutedEvent == UIElement.MouseEnterEvent 
                   || x.RoutedEvent == UIElement.MouseLeaveEvent).ToList()) 
    { 
     grid.Triggers.Remove(eventToUnsubscribe); 
    };