Изменить ControlTemplate стиля в WPF - PullRequest
0 голосов
/ 25 января 2012
MobileApp.Get().Resources.MergedDictionaries.Clear();
Uri uri = new Uri("/Resources/NightModeButton.xaml", UriKind.Relative);
ResourceDictionary resDict = Application.LoadComponent(uri) as ResourceDictionary;

int count = resDict.Values.Count; //count is 1

foreach (object obj in resDict.Values)
{
   Style style = obj as Style;  //NOW I HAVE THE STYLE

   //How do I modify the color of element named "GradientStop0" ???
}
<!-- NightButtonMode.xaml --> 
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style TargetType="{x:Type Button}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid>
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">

                                <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[2].(GradientStop.Color)" Storyboard.TargetName="InnerRectangle">
                                                <EasingColorKeyFrame KeyTime="0" Value="#FF9B7C35"/>
                                            </ColorAnimationUsingKeyFrames>
                                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="InnerRectangle">
                                                <EasingColorKeyFrame KeyTime="0" Value="#FF837C35"/>
                                            </ColorAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="Pressed"/>
                                    <VisualState x:Name="Disabled"/>
                                </VisualStateGroup>

                            </VisualStateManager.VisualStateGroups>
                            <Rectangle x:Name="InnerRectangle" Margin="8,8,8,8" RadiusY="10" RadiusX="10" StrokeThickness="5">
                                <Rectangle.Effect>
                                    <BlurEffect/>
                                </Rectangle.Effect>
                                <Rectangle.Stroke>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#7F7E7E7E" Offset="1" />
                                        <GradientStop Color="#7F605F5F"  x:Name="GradientStop0"/>
                                    </LinearGradientBrush>
                                </Rectangle.Stroke>
                                <Rectangle.Fill>
                                    <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0">
                                        <GradientStop Color="White" Offset="0.228"/>
                                        <GradientStop Color="#FFB0BAA1"/>
                                        <GradientStop Color="#FFB0BAA1" Offset="0.823"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                            <Rectangle x:Name="GlassCube" Margin="8,8,8,8" RadiusY="10" RadiusX="10" StrokeThickness="5" Opacity="1">
                                <Rectangle.Stroke>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="#7FFFFFFF" />
                                        <GradientStop Color="#7FFFFFFF"/>
                                        <GradientStop Color="#F2FFFFFF" Offset="0.254"/>
                                        <GradientStop Color="#BFFFFFFF" Offset="0.401"/>
                                    </LinearGradientBrush>
                                </Rectangle.Stroke>
                                <Rectangle.OpacityMask>
                                    <RadialGradientBrush>
                                        <GradientStop Color="#FFFBFBFB" Offset="0"/>
                                        <GradientStop Color="White" Offset="1"/>
                                    </RadialGradientBrush>
                                </Rectangle.OpacityMask>
                                <Rectangle.Fill>
                                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                                        <GradientStop Color="White" Offset="0"/>
                                        <GradientStop Color="#FFFDFDFD"/>
                                        <GradientStop Color="#7FFEFEFE"/>
                                        <GradientStop Color="#FFFDFDFD"/>
                                        <GradientStop Color="#7FFDFDFD" Offset="0.004"/>
                                        <GradientStop Color="#FFFDFDFD"/>
                                        <GradientStop Color="#7FFDFDFD"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                            <ContentPresenter x:Name="myContentPresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsCancel" Value="False"/>
                            <EventTrigger RoutedEvent="FrameworkElement.Loaded"/>
                            <EventTrigger RoutedEvent="FrameworkElement.Loaded"/>
                            <EventTrigger RoutedEvent="FrameworkElement.Loaded"/>
                            <Trigger Property="IsEnabled" Value="False"/>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

</ResourceDictionary>

1 Ответ

2 голосов
/ 25 января 2012

Вы практически не можете изменять части шаблонов, даже не пытайтесь.

Если вам нужно изменить цвет повсюду, объявите его как ресурс и укажите его там, где это необходимо, используя DynamicResource, если вы затем замените его другим цветом, все должно обновиться.

например

<Color x:Key="HighlightColor">Red</Color>
<SolidColorBrush x:Key="HighlightBrush" Color="{DynamicResource HighlightColor}" />
<Border.Background>
    <LinearGradientBrush>
        <GradientStop Offset="0" Color="White" />
        <GradientStop Offset="1" Color="{DynamicResource HighlightColor}" />
    </LinearGradientBrush>
</Border.Background>
Resources["HighlightColor"] = Colors.Green;
...