2012-04-20 4 views
0

スタイルが適用された一連のToggleButtonがあります。私は、ボタンがチェックされたときに背景色を変更できるようにしたい。各ToggleButtonは、次のコードを持つ同じCheckedイベントに割り当てられます。プログラムでバックグラウンドスタイルをオーバーライドする

Private Sub togAnswer_Checked(ByVal sender as Object, ByVal e as System.Windows.RoutedEventArgs) 
    'togAnswer was clicked.... 
    Dim togC as ToggleButton 
    Dim togS as String = TryCast(sender, ToggleButton).Name.ToString() 
    'Cycle through all answers and set style 
    Dim bc = New BrushConverter() 

    For x = 1 to 3 
     togC = DirectCast(FindName("togAnswer" & x), ToggleButton) 

     If togS = "togAnswer" & x.ToString Then 
      'Set ToggleButton to selected colour 
      togC.Background = DirectCast(bc.ConvertFrom("#AAFF8020"), Brush) 
     Else  
      'Set other ToggleButtons to unselected colour 
      togC.Background = DirectCast(bc.ConvertFrom("#AA000000"), Brush) 
     End If 
    Next 
End Sub 

コードはソースToggleButtonを正しく識別しますが、色は変更されません。

トグルボタンに割り当てられたスタイルは次のとおりです。

<Style x:Key="GlassToggleButton" TargetType="{x:Type ToggleButton}"> 
    <Setter Property="FontSize" Value="24" /> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ToggleButton}"> 
       <Border x:Name="ToggleBorder" 
        CornerRadius="0 15 0 15" 
        Background="#AA000000" 
        BorderBrush="#99FFFFFF" 
        RenderTransformOrigin="0.5,0.5"> 
        <Grid> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="*"/> 
          <RowDefinition Height="1.7*"/> 
         </Grid.RowDefinitions> 
         <Border Grid.Row="0" CornerRadius="0,14,0,0"> 
          <Border.Background> 
           <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> 
            <GradientStop Color="#02FFFFFF" Offset="0"/> 
            <GradientStop Color="#55FFFFFF" Offset="0.5"/> 
            <GradientStop Color="#11FFFFFF" Offset="1"/> 
           </LinearGradientBrush> 
          </Border.Background> 
         </Border> 
         <ContentPresenter x:Name="ToggleContentPresenter" 
          VerticalAlignment="Center" 
          HorizontalAlignment="Center" 
          Grid.RowSpan="2" /> 
        </Grid> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter Property="RenderTransform" TargetName="ToggleBorder"> 
          <Setter.Value> 
           <TransformGroup> 
            <ScaleTransform ScaleX="0.95" ScaleY="0.95"/> 
           </TransformGroup> 
          </Setter.Value> 
         </Setter> 
         <Setter Property="Background" Value="#AAFF8020" /> 
        </Trigger> 
        <Trigger Property="IsChecked" Value="True"> 
         <Setter Property="Background" Value="#AAFF8020" /> 
        </Trigger> 
        <Trigger Property="IsChecked" Value="False"> 
         <Setter Property="Background" Value="#AA000000" /> 
        </Trigger> 
        <Trigger Property="IsChecked" Value="{x:Null}"> 
         <Setter Property="Background" Value="#AA000000" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Xamlでこれを行うことができない理由はありますか?それはずっと簡単で堅牢です。 –

+0

私はwpfに新しいです...私は.net Webアプリケーションを開発する傾向があります。私が構築しているアプリは、最大3つの可能な回答/質問ができるクイズアプリです。私は各質問を表示するので、適切な数のボタンが表示されます。ユーザーがボタンをクリックすると、背景の色が変わります。ユーザーが気を変えた場合は、以前に選択したボタンをオフにして、背景色を元に戻し、新しい選択をチェックします。また、質問に戻るオプションがありますので、必要に応じてユーザーが変更できる選択された回答を確認する必要があります。アドバイスを受けてください。 – Mych

+0

ToggleButtonがチェックされたときに背景色を変更するのは、あなたのスタイルでXamlの約5行の問題です。 –

答えて

1

あなたのテンプレートで明示的に境界線の背景色を設定しているので、Backgroundが上書きされますトリガが(テンプレートがそれを無視します)動作しません。あなたがする必要があるのは、自分のスタイルをリファクタリングして、コントロール自身の趣味を尊重することです。Background代わりにあなたのBorderBackground="#AA000000"を設定する

は、Background="{TemplateBinding Background}" - this kind of binding only works within aのControlTemplate . Then, add another setter in your style that sets背景to#のAA000000`を設定します。トリガーに効果があることがわかります!

+0

ダンのおかげさま...私のスタイルのちょうど1つのラインを変更しました。私はまだコードビハインドが必要でしたが、すべてが良いです。 – Mych

関連する問題