2013-08-08 24 views
8

Tôi hiện đang cóĐặt một bảo vệ trên một kích hoạt sự kiện WPF. Điều này có thể không?

<ContentControl 
    Grid.Column="2" Grid.Row="3" 
    > 
    <ContentControl.Triggers> 
     <EventTrigger RoutedEvent="UIElement.MouseEnter"> 
      <BeginStoryboard 
       Storyboard="{StaticResource ShakeStatorMinorRadiusEdit}"/> 
     </EventTrigger> 
    </ContentControl.Triggers> 

    ... <snip> ... 

</ContentControl> 

<Grid.Resources> 
     <Storyboard x:Key="ShakeStatorMinorRadiusEdit"> 
      <DoubleAnimationUsingKeyFrames 
         Storyboard.TargetName="StatorMinorRadiusEdit" 
         Storyboard.TargetProperty="RenderTransform.X" 
         RepeatBehavior="5x" 
         > 
       <EasingDoubleKeyFrame KeyTime="0:0:0.05" Value="0"/> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.1" Value="3"/> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.15" Value="0"/> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.20" Value="-3"/> 
       <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="0"/> 
      </DoubleAnimationUsingKeyFrames> 
     </Storyboard> 
    </Grid.Resources> 

enter image description here

Ý tưởng là khi chuột đi vào vàng nhấn mạnh kiểm soát ở bên trái màu vàng nổi bật điều khiển trên bên phải sẽ lắc. Điều khiển bên phải có x: Tên = StatorMinorRadiusEdit Cho đến nay rất tốt các tác phẩm trên.

Bây giờ tôi muốn thêm một biến chứng khác. Tôi chỉ muốn các hình ảnh động để kích hoạt nếu một giá trị trên mô hình xem của tôi RotorLobes == 1. Trong một thế giới tưởng tượng tôi sẽ làm.

<ContentControl 
    Grid.Column="2" Grid.Row="3" 
    > 
    <ContentControl.Triggers> 
     <EventTrigger RoutedEvent="UIElement.MouseEnter"> 

      <If Property="{Binding RotorLobes}" Value="1"/> 

      <BeginStoryboard 
       Storyboard="{StaticResource ShakeStatorMinorRadiusEdit}"/> 
     </EventTrigger> 
    </ContentControl.Triggers> 

    ... <snip> ... 

</ContentControl> 

Trong thế giới thực, tôi không biết làm thế nào để đạt được điều này.

+0

Thật không may câu trả lời từ Mark Green không hoạt động mặc dù nó là một thử nghiệm thực sự tốt và thích. Có lẽ không phải là một ý tưởng tốt để đánh dấu nó lên bất kỳ người cao hơn. – bradgonesurfing

+0

Tôi hy vọng câu trả lời đã chỉnh sửa sẽ giúp bạn gần hơn một chút. –

+0

Vâng. Tôi khá chắc chắn nó được vòng vấn đề tôi xác định. XAML là một con lợn thực sự. Ví dụ, không thể xác định một bảng câu chuyện như một tài nguyên tĩnh và sau đó áp dụng nó cho một phần tử từ xa thông qua TargetName theo bất kỳ cách nào hợp lý. – bradgonesurfing

Trả lời

4

Bạn có thể thử thay đổi từ EventTrigger thành một MultiTrigger và sử dụng thuộc tính IsMouseOver thay vì sự kiện MouseEnter. Tuy nhiên, khi bạn phát hiện ra, Bảng phân cảnh theo kiểu không cho phép bạn chỉ định TargetName, vì vậy điều quan trọng là phải di chuyển trình kích hoạt đến đối tượng đích.

Ví dụ bên dưới mã hóa cứng giá trị của Rotor thành 1 và bạn sẽ cần phải đặt tên chính xác không gian tên RenderTransform trong TargetProperty hoặc bạn sẽ nhận được ngoại lệ thời gian chạy.

<Grid> 
     <Grid.Resources> 
      <Storyboard x:Key="ShakeStatorMinorRadiusEdit"> 
       <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="RenderTransform.(TranslateTransform.X)" 
               RepeatBehavior="5x"> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.05" 
              Value="0" /> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.1" 
              Value="3" /> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.15" 
              Value="0" /> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.20" 
              Value="-3" /> 
        <EasingDoubleKeyFrame KeyTime="0:0:0.25" 
              Value="0" /> 
       </DoubleAnimationUsingKeyFrames> 
      </Storyboard> 
     </Grid.Resources> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 

     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 

     <TextBlock Grid.Column="1">Rotor</TextBlock> 
     <TextBlock Grid.Column="2">Stator</TextBlock> 

     <TextBlock Grid.Column="0" 
        Grid.Row="1">Lobes</TextBlock> 
     <TextBlock Grid.Column="0" 
        Grid.Row="2">Major Radius</TextBlock> 
     <TextBlock Grid.Column="0" 
        Grid.Row="3">Minor Radius</TextBlock> 

     <TextBox Name="RotorLobes" 
       Grid.Column="1" 
       Grid.Row="1" 
       Text="1" /> 
     <TextBox Grid.Column="1" 
       Grid.Row="2" /> 
     <TextBox Name="MinorRadiusRotor" 
       Background="Blue" 
       Grid.Column="1" 
       Grid.Row="3" /> 

     <TextBox Grid.Column="2" 
       Grid.Row="1" /> 
     <TextBox Grid.Column="2" 
       Grid.Row="2" /> 
     <TextBox Name="MinorRadiusStator" 
       Background="Green" 
       Grid.Column="2" 
       Grid.Row="3"> 
      <TextBox.Style> 
       <Style> 
        <Style.Triggers> 
         <MultiDataTrigger> 
          <MultiDataTrigger.Conditions> 
           <Condition Binding="{Binding ElementName=MinorRadiusRotor, Path=IsMouseOver}" 
              Value="True" /> 
           <Condition Binding="{Binding ElementName=RotorLobes, Path=Text}}" 
              Value="1" /> 
          </MultiDataTrigger.Conditions> 
          <MultiDataTrigger.EnterActions> 
           <BeginStoryboard Storyboard="{StaticResource ShakeStatorMinorRadiusEdit}" /> 
          </MultiDataTrigger.EnterActions> 
         </MultiDataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBox.Style> 
     </TextBox> 

    </Grid> 
+0

EnterAction super :) Không hoàn toàn là câu trả lời cho câu hỏi đặt người bảo vệ vào sự kiện nhưng sẽ giải quyết vấn đề cụ thể của tôi. – bradgonesurfing

+0

Thực ra nó không hoạt động cho một vấn đề tinh tế. Bởi vì tôi muốn kích hoạt bảng phân cảnh và bảng phân cảnh cần sử dụng '' Storyboard.TargetName = "StatorMinorRadiusEdit'' để tham khảo điều khiển tay phải, tôi nhận được lỗi XAML nói rằng tôi không thể sử dụng' 'TargetName'' theo kiểu. Khi bạn nhìn vào điều này thông qua google một số các bài viết nói để sử dụng EventTriggers thay vào đó và sau đó chúng tôi đang trở lại với câu hỏi ban đầu.Grrrrrrr – bradgonesurfing

+0

Hy vọng bạn không nhớ.Tôi cập nhật câu trả lời của bạn với XAML đầy đủ thịt để minh họa vấn đề. – bradgonesurfing

Các vấn đề liên quan