WinRT XAML按钮样式,没有悬停或单击状态

时间:2014-04-10 00:26:23

标签: xaml windows-runtime winrt-xaml

我很好奇什么是阻止XAML按钮进行翻转和点击状态的最简单方法?

根据我的理解,我可以选择的选项是:

  1. 使用VisualStateManager
  2. 以编程方式阻止互动
  3. 在WPF中,我可以使用ControlTemplate.Trigger,但WinRT不会公开此元素。当然,遵循MVVM模式我想在纯XAML中做到这一点。

    这是我的按钮:

     <Button Style="{StaticResource FooBarIcon}" />
    

    和相应的风格:

        <Style x:Key="AppIconStepThreeButtonStyle" TargetType="ButtonBase" >
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ButtonBase">
                    <Button Background="Transparent">
                        <Button.Content>
                            <Image Margin="0"  Width="40" Source="../Assets/buttonIcon.png" />
                        </Button.Content>
                    </Button>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    

    此代码会在点击或翻转时发生,背景变为白色。我想在不定义VisualState的情况下保持透明。

    这可能吗?我希望在一行代码中完成一个属性或设置。

    另外我想我可以模仿一个按钮但是使用带有ImageBrush填充的Rectangle,但是本着保持语义正确的精神,我很高兴将它保持为xaml按钮元素。

    由于

1 个答案:

答案 0 :(得分:3)

您可以检查WinRT XAML Toolkit中的ImageButton控件是否是更好的解决方案。目前,您的模板完全错误,因为您要将其替换为使用默认模板的其他Button。您可以通过在设计视图中右键单击按钮来提取默认模板 - 在Blend或VS中,或在“文档大纲”面板中。这是默认模板:

<ControlTemplate
    TargetType="Button">
    <Grid>
        <VisualStateManager.VisualStateGroups>
            <VisualStateGroup
                x:Name="CommonStates">
                <VisualState
                    x:Name="Normal" />
                <VisualState
                    x:Name="PointerOver">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames
                            Storyboard.TargetProperty="Background"
                            Storyboard.TargetName="Border">
                            <DiscreteObjectKeyFrame
                                KeyTime="0"
                                Value="{ThemeResource ButtonPointerOverBackgroundThemeBrush}" />
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames
                            Storyboard.TargetProperty="Foreground"
                            Storyboard.TargetName="ContentPresenter">
                            <DiscreteObjectKeyFrame
                                KeyTime="0"
                                Value="{ThemeResource ButtonPointerOverForegroundThemeBrush}" />
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>
                <VisualState
                    x:Name="Pressed">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames
                            Storyboard.TargetProperty="Background"
                            Storyboard.TargetName="Border">
                            <DiscreteObjectKeyFrame
                                KeyTime="0"
                                Value="{ThemeResource ButtonPressedBackgroundThemeBrush}" />
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames
                            Storyboard.TargetProperty="Foreground"
                            Storyboard.TargetName="ContentPresenter">
                            <DiscreteObjectKeyFrame
                                KeyTime="0"
                                Value="{ThemeResource ButtonPressedForegroundThemeBrush}" />
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>
                <VisualState
                    x:Name="Disabled">
                    <Storyboard>
                        <ObjectAnimationUsingKeyFrames
                            Storyboard.TargetProperty="Background"
                            Storyboard.TargetName="Border">
                            <DiscreteObjectKeyFrame
                                KeyTime="0"
                                Value="{ThemeResource ButtonDisabledBackgroundThemeBrush}" />
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames
                            Storyboard.TargetProperty="BorderBrush"
                            Storyboard.TargetName="Border">
                            <DiscreteObjectKeyFrame
                                KeyTime="0"
                                Value="{ThemeResource ButtonDisabledBorderThemeBrush}" />
                        </ObjectAnimationUsingKeyFrames>
                        <ObjectAnimationUsingKeyFrames
                            Storyboard.TargetProperty="Foreground"
                            Storyboard.TargetName="ContentPresenter">
                            <DiscreteObjectKeyFrame
                                KeyTime="0"
                                Value="{ThemeResource ButtonDisabledForegroundThemeBrush}" />
                        </ObjectAnimationUsingKeyFrames>
                    </Storyboard>
                </VisualState>
            </VisualStateGroup>
            <VisualStateGroup
                x:Name="FocusStates">
                <VisualState
                    x:Name="Focused">
                    <Storyboard>
                        <DoubleAnimation
                            Duration="0"
                            To="1"
                            Storyboard.TargetProperty="Opacity"
                            Storyboard.TargetName="FocusVisualWhite" />
                        <DoubleAnimation
                            Duration="0"
                            To="1"
                            Storyboard.TargetProperty="Opacity"
                            Storyboard.TargetName="FocusVisualBlack" />
                    </Storyboard>
                </VisualState>
                <VisualState
                    x:Name="Unfocused" />
                <VisualState
                    x:Name="PointerFocused" />
            </VisualStateGroup>
        </VisualStateManager.VisualStateGroups>
        <Border
            x:Name="Border"
            BorderBrush="{TemplateBinding BorderBrush}"
            BorderThickness="{TemplateBinding BorderThickness}"
            Background="{TemplateBinding Background}"
            Margin="3">
            <ContentPresenter
                x:Name="ContentPresenter"
                AutomationProperties.AccessibilityView="Raw"
                ContentTemplate="{TemplateBinding ContentTemplate}"
                ContentTransitions="{TemplateBinding ContentTransitions}"
                Content="{TemplateBinding Content}"
                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                Margin="{TemplateBinding Padding}"
                VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
        </Border>
        <Rectangle
            x:Name="FocusVisualWhite"
            IsHitTestVisible="False"
            Opacity="0"
            StrokeDashOffset="1.5"
            StrokeEndLineCap="Square"
            Stroke="{ThemeResource FocusVisualWhiteStrokeThemeBrush}"
            StrokeDashArray="1,1" />
        <Rectangle
            x:Name="FocusVisualBlack"
            IsHitTestVisible="False"
            Opacity="0"
            StrokeDashOffset="0.5"
            StrokeEndLineCap="Square"
            Stroke="{ThemeResource FocusVisualBlackStrokeThemeBrush}"
            StrokeDashArray="1,1" />
    </Grid>
</ControlTemplate>

您可以从&#34; PointerOver&#34;中移除Storyboards。和#34;按下&#34; VSM中的状态,你应该得到所需的效果。