将CustomControl的视觉状态管理器与其样式分开

问题描述

我遵循着awesome tutorial的有关自定义控件的内容,在播放列表的第四段视频中,肖恩(Sean)浏览了视觉状态。在他的AnalogClockStyle.xaml中,他演示了控件网格内的一个简单的可视状态管理器,但是我可以想象,如果您只想分析控件模板,那么对于更复杂设计的自定义控件是不可行的。

是否可以将视觉状态管理器与控件模板的样式文件分开?理想情况下,我想为自定义控件*.cs文件,控件模板*.xaml文件,各自的样式*.xaml文件以及最终的可视状态管理器文件(如果可能)创建文件夹。>

这是当前控件模板的样子:

<Style targettype="local:AnalogClock">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate targettype="local:AnalogClock">
                <ControlTemplate.Resources>
                    <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
                    <converters:GreaterThanMultiConverter x:Key="GreaterThanMultiConverter"/>
                    <converters:DivisionConverter x:Key="DivisionConverter"/>
                </ControlTemplate.Resources>
                <Grid x:Name="Clock" RenderTransformOrigin="0.5 0.5">
                    <Grid.RenderTransform>
                        <RotateTransform Angle="90"/>
                    </Grid.RenderTransform>

<!-- Move the Visual State Manager code to a separate file? -->
                    <visualstatemanager.VisualStateGroups>
                        <VisualStateGroup x:Name="TimeStates">
                            <VisualState x:Name="Day">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="ClockFill"
                                                Storyboard.TargetProperty="Color"
                                                To="SkyBlue"/>
                                    <ColorAnimation Storyboard.TargetName="Hourstroke"
                                                Storyboard.TargetProperty="Color"
                                                To="Gold"/>
                                    <ColorAnimation Storyboard.TargetName="Minutestroke"
                                                Storyboard.TargetProperty="Color"
                                                To="Gold"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Night">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="ClockFill"
                                                Storyboard.TargetProperty="Color"
                                                To="Black"/>
                                    <ColorAnimation Storyboard.TargetName="Hourstroke"
                                                Storyboard.TargetProperty="Color"
                                                To="White"/>
                                    <ColorAnimation Storyboard.TargetName="Minutestroke"
                                                Storyboard.TargetProperty="Color"
                                                To="White"/>
                                </Storyboard>
                            </VisualState>
                            <VisualState x:Name="Christmas">
                                <Storyboard>
                                    <ColorAnimation Storyboard.TargetName="ClockFill"
                                                Storyboard.TargetProperty="Color"
                                                To="Green"/>
                                    <ColorAnimation Storyboard.TargetName="Hourstroke"
                                                Storyboard.TargetProperty="Color"
                                                To="Red"/>
                                    <ColorAnimation Storyboard.TargetName="Minutestroke"
                                                Storyboard.TargetProperty="Color"
                                                To="Red"/>
                                </Storyboard>
                            </VisualState>
                        </VisualStateGroup>
                    </visualstatemanager.VisualStateGroups>
<!-- Move the Visual State Manager code to a separate file? -->

                    <Ellipse x:Name="PART_Clock" stroke="Black" strokeThickness="1">
                        <Ellipse.Style>
                            <Style targettype="Ellipse">
                                <Setter Property="Width" Value="{Binding ActualHeight,ElementName=Clock}"/>
                                <Setter Property="Height" Value="auto"/>
                                <Style.Triggers>
                                    <DataTrigger Value="True">
                                        <DataTrigger.Binding>
                                            <MultiBinding Converter="{StaticResource GreaterThanMultiConverter}">
                                                <MultiBinding.Bindings>
                                                    <Binding Path="ActualHeight" ElementName="Clock"/>
                                                    <Binding Path="ActualWidth" ElementName="Clock"/>
                                                </MultiBinding.Bindings>
                                            </MultiBinding>
                                        </DataTrigger.Binding>
                                        <DataTrigger.Setters>
                                            <Setter Property="Height" Value="{Binding ActualWidth,ElementName=Clock}"/>
                                            <Setter Property="Width" Value="auto"/>
                                        </DataTrigger.Setters>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Ellipse.Style>
                        <Ellipse.Fill>
                            <SolidColorBrush x:Name="ClockFill" Color="White"/>
                        </Ellipse.Fill>
                    </Ellipse>

                    <Line x:Name="PART_HourHand" strokeThickness="1" VerticalAlignment="Center" HorizontalAlignment="Center" X1="0" 
                        X2="{Binding ActualHeight,ElementName=PART_Clock,Converter={StaticResource DivisionConverter},ConverterParameter=-4}">
                        <Line.stroke>
                            <SolidColorBrush x:Name="Hourstroke" Color="Black"/>
                        </Line.stroke>
                    </Line>
                    <Line x:Name="PART_MinuteHand" strokeThickness="1" VerticalAlignment="Center" HorizontalAlignment="Center" X1="0" 
                        X2="{Binding ActualHeight,ConverterParameter=-2.5}">
                        <Line.stroke>
                            <SolidColorBrush x:Name="Minutestroke" Color="Black"/>
                        </Line.stroke>
                    </Line>

                    <Line x:Name="PART_SecondHand" Visibility="{TemplateBinding ShowSeconds,Converter={StaticResource BooleanToVisibilityConverter}}" stroke="Red" strokeThickness="1" VerticalAlignment="Center" HorizontalAlignment="Center" X1="0"
                        X2="{Binding ActualHeight,ConverterParameter=-2.5}"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)