WPF样式未在运行时应用

时间:2017-02-05 16:34:14

标签: c# wpf xaml wpf-style

我正在尝试在CheckBox上应用Style。问题是:Style在设计时应用,但不在运行时应用。它只在我将Style放在MainWindow.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> 。在App.xaml中这是:

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

这就是我尝试应用样式的方式:

Style

更新 我发现当我的启动位置不是App时,<?php header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); $val = 20; echo "data: The value is: " . $val . "\n\n"; flush(); 不是在运行时应用,而是我创建的Program.cs类。

3 个答案:

答案 0 :(得分:1)

我发现当我的启动位置不是App时,风格不会在运行时应用,而是我创建Program.cs的类。

答案 1 :(得分:0)

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

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

在代码背后:

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

答案 2 :(得分:0)

当样式TargetType用于基类而不是特定的派生类时,我已经看到这种情况发生。在这种情况下,设计师向我展示了所要应用的样式,但在运行时却没有。

我特别在使用VS2015设计器。

我最终通过遵循Applying a style to all derived classes in WPFHow to make a WPF style inheritable to derived classes?中的建议解决了这个问题。