2013-03-06 16 views
5

Wydaje mi się, że istnieje zasadnicza różnica pomiędzy mieszanka stylu Trigger y znalezione w przestrzeni nazw Interaktywność i klasyczne Trigger s dostępne poprzez stylów, ControlTemplate s, itp, w WPF (I przypuszczam, że to prawdopodobnie dotyczy także SilverLight).Mieszanka wyzwalania vs. WPF wyzwalania

W trybie WPF po ustawieniu Trigger za pomocą Settera uzyskuje się dwa zachowania: jeśli warunek wyzwalania zostanie spełniony, zostanie zastosowany seter. Jednak gdy wyzwalacz przestanie być spełniony, poprzednia wartość zostanie przywrócona. Jest to niezwykle przydatne przy programowaniu interfejsu użytkownika.

Próbowałem również kodować DataTrigger podobnie za pomocą metody Blend: Zastosowałem ChangePropertyAction do mojej kontroli, i mam to wyzwala Off Interactivity DataTrigger używając Binding do mojego ViewModel.

<Rectangle x:Name="SecondaryHighlightBackground" Fill="#FF505050"> 
      <i:Interaction.Triggers> 
       <ei:DataTrigger Binding="{Binding IsHighlighted}" Value="Value"> 
        <ei:ChangePropertyAction PropertyName="Opacity" Value="0.5"/> 
       </ei:DataTrigger> 
      </i:Interaction.Triggers> 
... 
</Rectangle> 

Tak to działało zgodnie z oczekiwaniami ... z wyjątkiem byłem oszołomiony, aby dowiedzieć się, że kiedy przerzucić wartość IsHighlighted false, że oryginalny Krycie 0% nie jest przywrócona (I ustawić, że niżej). Aby dokładnie sprawdzić to, napisałem ten przykład w celu sprawdzenia:

<Window x:Class="TestWpfApp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Name="Window" 
     Title="MainWindow" 
     Width="640" 
     Height="480"> 

    <Grid x:Name="LayoutRoot"> 
     <Button Name="button1" 
       Width="173" 
       Height="57" 
       Margin="10,10,0,0" 
       HorizontalAlignment="Left" 
       VerticalAlignment="Top"> 
      <Button.Style> 
       <Style TargetType="Button"> 
        <Setter Property="Content" Value="foo" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding IsMouseOver, ElementName=button1}" Value="True"> 
          <Setter Property="Content" Value="bar" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Button.Style> 
     </Button> 
    </Grid> 
</Window> 

Oczekiwane zachowanie jest, że jeśli jeśli myszy nad przyciskiem, zmienia się treść do „bar”. Odsunięcie myszy powoduje przywrócenie zawartości do "Foo", zgodnie ze stylem. Styl określa zawartość, aby uniknąć problemu dotyczącego priorytetu właściwości.

Moje pytanie brzmi: Czy w rozszerzeniach Blend naprawdę brakuje tylko dwukierunkowego wyzwalania, czy jest jakiś sposób, aby to jakoś włączyć?

Czy czegoś brakuje? Myślałem, że to jest właśnie punkt wyzwalaczy, że mają tę dwukierunkową funkcjonalność. Chciałbym nadal używać działań interaktywnych Blend, ponieważ uważam je za przydatne i intuicyjne, ale tego rodzaju rzeczy zmuszają mnie do ręcznego kodowania XAML.

Odpowiedz

1

Jeśli dobrze rozumiem, po prostu musisz podać wartość dla innej wartości w wyzwalaczu, ponieważ nie zrobi tego domyślnie, ponieważ przejęliście kontrolę nad tym stanem. Coś jak;

+0

To jest jednak mój problem - nie chcę kodować wartości zwracanej, chcę, aby przyjęła wartość instancji sprzed wyzwolenia wyzwalacza. Tak działają normalne wyzwalacze WPF/Silverlight. – cunningdave

+0

Myślę, że być może rozmawiasz w tym sensie, że używasz 'VisualStateManager', w którym określony jest domyślny' State', więc wie, że ma konkretną instancję do powrotu. Jednak, gdy używasz wyzwalaczy jako takich, czy to w WPF, czy SL, jestem pewien, że zawsze będziesz musiał kontrolować powrót do innego stanu, ponieważ nie ma dostępnych domyślnych, jak to jest, gdy używasz stanów zamiast wyzwalaczy, ponieważ ręcznie zmieniasz jego właściwości, z wyjątkiem przypadku niezmiennego obiektu, w którym i tak nie można go zmienić. –

+0

Nie, to naprawdę nie to mam na myśli. Dodałem trywialny przykład powyżej, aby zilustrować normalne zachowanie wyzwalacza. – cunningdave

Powiązane problemy