2017-02-05 75 views
3

我试图在CheckBox上应用Style。问题是:Style在设计时应用,但不是在运行时应用。只有当我把Style放在MainWindow.xaml中时它才起作用。在运行时不应用WPF样式

我在资源字典中有Style。这是,在App.xaml中:

<Application.Resources> 
    <ResourceDictionary> 
    <Style x:Key="ToggleButton" TargetType="{x:Type CheckBox}"> 
     <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}"/> 
     <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/> 
     <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type CheckBox}"> 
      <ControlTemplate.Resources> 
       <Storyboard x:Key="OnChecking"> 
       <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="slider" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"> 
        <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="25"/> 
       </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
       <Storyboard x:Key="OnUnchecking"> 
       <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="slider" Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)"> 
        <SplineDoubleKeyFrame KeyTime="00:00:00.3000000" Value="0"/> 
       </DoubleAnimationUsingKeyFrames> 
       <ThicknessAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="slider" Storyboard.TargetProperty="(FrameworkElement.Margin)"> 
        <SplineThicknessKeyFrame KeyTime="00:00:00.3000000" Value="1,1,1,1"/> 
       </ThicknessAnimationUsingKeyFrames> 
       </Storyboard> 
      </ControlTemplate.Resources> 

      <DockPanel x:Name="dockPanel"> 
       <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" ContentTemplate="{TemplateBinding ContentTemplate}" RecognizesAccessKey="True" VerticalAlignment="Center"/> 
       <Grid Margin="5,5,0,5" Width="50" Background="#FFC0CCD9"> 
       <TextBlock Text="ON" TextWrapping="Wrap" FontWeight="Bold" FontSize="12" HorizontalAlignment="Right" Margin="0,0,3,0"/> 
       <TextBlock HorizontalAlignment="Left" Margin="2,0,0,0" FontSize="12" FontWeight="Bold" Text="OFF" TextWrapping="Wrap"/> 
       <Border HorizontalAlignment="Left" x:Name="slider" Width="23" BorderThickness="1,1,1,1" CornerRadius="3,3,3,3" RenderTransformOrigin="0.5,0.5" Margin="1,1,1,1"> 
        <Border.RenderTransform> 
        <TransformGroup> 
         <ScaleTransform ScaleX="1" ScaleY="1"/> 
         <SkewTransform AngleX="0" AngleY="0"/> 
         <RotateTransform Angle="0"/> 
         <TranslateTransform X="0" Y="0"/> 
        </TransformGroup> 
        </Border.RenderTransform> 
        <Border.BorderBrush> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="#FFFFFFFF" Offset="0"/> 
         <GradientStop Color="#FF4490FF" Offset="1"/> 
        </LinearGradientBrush> 
        </Border.BorderBrush> 
        <Border.Background> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="#FF8AB4FF" Offset="1"/> 
         <GradientStop Color="#FFD1E2FF" Offset="0"/> 
        </LinearGradientBrush> 
        </Border.Background> 
       </Border> 
       </Grid> 
      </DockPanel> 

      <ControlTemplate.Triggers> 
       <Trigger Property="IsChecked" Value="True"> 
       <Trigger.ExitActions> 
        <BeginStoryboard Storyboard="{StaticResource OnUnchecking}" x:Name="OnUnchecking_BeginStoryboard"/> 
       </Trigger.ExitActions> 
       <Trigger.EnterActions> 
        <BeginStoryboard Storyboard="{StaticResource OnChecking}" x:Name="OnChecking_BeginStoryboard"/> 
       </Trigger.EnterActions> 
       </Trigger> 
       <Trigger Property="IsEnabled" Value="False"> 
       <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    </ResourceDictionary> 
</Application.Resources> 

这是我正在尝试应用样式:

<CheckBox HorizontalAlignment="Center" Style="{DynamicResource ToggleButton}" VerticalAlignment="Center" Content="Test"/> 

UPDATE: 我发现了Style没有在运行 - 应用当我的启动位置不是应用程序,而是我创建的类Program.cs。

+0

它对我来说看起来很好,在运行时也是如此:什么不适用? –

+0

当我将它放入示例应用程序中时,您的准确XAML在设计时和运行时都可以完美运行。我会在应用程序中寻找其他可能会在运行时重写“ToggleButton”风格的其他内容。 – Stewbob

+0

只有当我将风格放在MainWindow.xaml中时才起作用 – user2412672

回答

1

我发现这种风格在运行时没有申请时,我的启动位置不是应用,而是类,我创建的Program.cs。

0

为您的复选框命名并尝试动态应用样式。

<CheckBox x:Name="chckbx1" HorizontalAlignment="Center" Style="{DynamicResource ToggleButton}" VerticalAlignment="Center" Content="Test"/> 

在后面的代码:

chckbx1.Style = (Style) FindResource("ToggleButton"); 
+0

我收到了风格无法找到的例外 – user2412672

+0

@ user2412672我自己尝试过,对我来说工作得很好。我不知道你是如何使用它或你在哪里使用它。如果你在一个不是从Window类派生的类中使用它(一般情况下),那么它将不起作用,因为Style派生自System.Windows名称空间。你可以把你的整个代码粘贴到你正在使用的地方。 – AlphaWarrior

相关问题