2012-12-06 22 views
5

To doprowadza mnie do szału. Mam prosty przycisk przełączania WPF, z dwoma wyzwalaczami dla IsChecked. Jedna dla wartości jest prawdziwa, a druga dla wartości będącej fałszem. Działa dobrze, gdy przycisk nie jest zaznaczony, mój styl na fałsz jest stosowany; jednak system nigdy nie stosuje stylu, gdy IsChecked ma wartość true. Zawsze po prostu używa domyślnego stylu Windows Blue Chrome. Jakieś pomysły?Przycisk WPF ToggleButton IsChecked Trigger

<ToggleButton Content="Control 1" Width="200" Margin="0,0,0,10" Focusable="False"> 
    <ToggleButton.Resources> 
     <Style TargetType="{x:Type ToggleButton}"> 
      <Style.Triggers> 
       <Trigger Property="IsChecked" Value="True"> 
        <Setter Property="Background"> 
         <Setter.Value> 
          <LinearGradientBrush EndPoint="0,1" StartPoint="0,0"> 
           <GradientStop Color="#FFF3F3F3" Offset="1"/> 
           <GradientStop Color="LawnGreen" Offset="0.307"/> 
          </LinearGradientBrush> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
       <Trigger Property="IsChecked" Value="False"> 
        <Setter Property="Background"> 
         <Setter.Value> 
          <LinearGradientBrush EndPoint="0,1" StartPoint="0,0"> 
           <GradientStop Color="#FFF3F3F3" Offset="1"/> 
           <GradientStop Color="Red" Offset="0.307"/> 
          </LinearGradientBrush> 
         </Setter.Value> 
        </Setter> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ToggleButton.Resources> 
</ToggleButton> 

Każda pomoc zostanie bardzo doceniona. Jestem pewien, że to coś oczywistego, że po prostu przeoczę.

+0

Próbowałem dodać twój kod do pustej siatki i działa dobrze. Czy masz zasoby stylu globalnego, które mogą wpływać na Twoją kontrolę? lub do którego kontenera dodajesz ten przycisk? –

+1

Z pewnością nie. Był to całkiem nowy plik .dll, w którym umieszczono moje elementy sterowania użytkownika, a ja nie utworzyłem jeszcze żadnych zasobów. To było takie dziwne. Poniższe zalecenie działało, ale na pewno chciałbym wiedzieć, dlaczego moja wersja nie. – Llaslo

Odpowiedz

15

Układ, gdy przełączniki ToggleButton.IsChecked wydaje się być częścią szablonu. Jeśli przesłonisz szablon, powinieneś być w stanie ustawić wartości poprawnie. Zobacz Override ToggleButton Style

Przykład:

<ToggleButton Content="Control 1" Focusable="False"> 
    <ToggleButton.Template> 
     <ControlTemplate TargetType="{x:Type ToggleButton}"> 
     <Border CornerRadius="3" Background="{TemplateBinding Background}"> 
      <ContentPresenter Margin="3" 
       HorizontalAlignment="Center" 
       VerticalAlignment="Center"/> 
     </Border> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsChecked" Value="True"> 
       <Setter Property="Background"> 
        <Setter.Value> 
        <LinearGradientBrush EndPoint="0,1" StartPoint="0,0"> 
         <GradientStop Color="#FFF3F3F3" Offset="1"/> 
         <GradientStop Color="LawnGreen" Offset="0.307"/> 
        </LinearGradientBrush> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      <Trigger Property="IsChecked" Value="False"> 
       <Setter Property="Background"> 
        <Setter.Value> 
        <LinearGradientBrush EndPoint="0,1" StartPoint="0,0"> 
         <GradientStop Color="#FFF3F3F3" Offset="1"/> 
         <GradientStop Color="Red" Offset="0.307"/> 
        </LinearGradientBrush> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
     </ToggleButton.Template> 
    </ToggleButton> 
+0

Dziękuję, to załatwiło sprawę. – Llaslo

3

wiem, moja odpowiedź przyniesie nic nowego, ale szablon sugerowanego przez newb wydaje się bardzo uproszczoną do mnie. Dlatego prezentuję własną wersję ControlTemplate. To może być przydatne dla kogoś.

<ToggleButton Width="100" Height="100"> 
    <ToggleButton.Template> 
     <ControlTemplate TargetType="{x:Type ToggleButton}"> 
      <Border BorderBrush="Orange" 
        BorderThickness="3" 
        CornerRadius="3" 
        Margin="1" 
        Name="Border" 
        Background="{TemplateBinding Background}"> 
       <Grid> 
        <Rectangle Name="FocusCue" 
          Visibility="Hidden" 
          Stroke="Black" 
          StrokeThickness="1" 
          StrokeDashArray="1 2" 
          SnapsToDevicePixels="True" ></Rectangle> 
        <ContentPresenter Margin="3" 
            HorizontalAlignment="Center" 
            VerticalAlignment="Center"/> 
       </Grid> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsChecked" Value="True"> 
        <Setter TargetName="Border" Property="Background" Value="IndianRed" /> 
        <Setter TargetName="Border" Property="BorderBrush" Value="DarkKhaki" /> 
       </Trigger> 
       <Trigger Property="IsChecked" Value="False"> 
        <Setter TargetName="Border" Property="Background" Value="Red" /> 
        <Setter TargetName="Border" Property="BorderBrush" Value="Orange" /> 
       </Trigger> 
       <Trigger Property="IsKeyboardFocused" Value="True"> 
        <Setter TargetName="FocusCue" Property="Visibility" Value="Visible" /> 
       </Trigger> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter TargetName="Border" Property="Background" Value="DarkRed" /> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </ToggleButton.Template> 
</ToggleButton>