更改样式颜色后刷新按钮

时间:2016-03-06 11:28:04

标签: c# xaml binding win-universal-app

所以,我在资源字典中有一个按钮模板。它在普通VisualState中的color属性绑定到MainPage C#代码中定义的DependencyProperty。请注意,MainControl是MainPage名称。 这是Button模板:

<Style TargetType="Button" x:Key="MyButtonStyle">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Grid>
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal">
                                <VisualState.Setters>
                                    <Setter Target="ellipse.(Shape.Fill)" Value="{Binding ElementName=MainControl, Path=ButtonColor}">
                                    </Setter>
                                    <Setter Target="ellipse.(Shape.Stroke)" Value="{x:Null}"/>
                                </VisualState.Setters>
                            </VisualState>
                            [Other Visual States...]
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Ellipse x:Name="ellipse"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

这是MainPage XAML:

<Page
x:Class="Volumio.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Volumio"
Name="MainControl">
<Grid Background="#FF525C66">
    <Button x:Name="toggle" Content="" HorizontalAlignment="Left" Height="132" Margin="40,146,0,0" VerticalAlignment="Top" Width="132" Style="{StaticResource MyButtonStyle}">
</Grid>

这是我定义属性的地方:

public static DependencyProperty ColorProperty = DependencyProperty.Register("ButtonColor", typeof(SolidColorBrush),
        typeof(Page), PropertyMetadata.Create(NormalColor));

    public SolidColorBrush ButtonColor
    {
        get { return (SolidColorBrush)GetValue(ColorProperty); }
        set { SetValue(ColorProperty, value); }
    }

问题是:每当我将ButtonColour属性设置为不同的颜色时,Button不会自动更改其颜色,而是我必须更改VisualState然后返回到normal以使其刷新并更改颜色。我改变了异步空洞中的属性。这有关系吗?

问题出在哪里?我是否必须从代码中手动刷新它?

这可能很明显,但我是XAML编程的新手。提前谢谢。

1 个答案:

答案 0 :(得分:0)

Setter下的{p> VisualState仅在VisualState用作当前状态时才会应用一次。当应用Setter时,它会从其Value属性中获取值,并设置为其Target属性中指定的目标元素和属性。

因此,您不会将Binding设置为Fill的{​​{1}}属性,并且您的按钮不会更改其颜色,除非按钮按下ellipse再次成为VisualState

如果您希望自动按钮更改颜色,可以删除Normal中的<Setter Target="ellipse.(Shape.Fill)" Value="{Binding ElementName=MainControl, Path=ButtonColor}"></Setter>并使用VisualState.Setters中的Binding,如:

Ellipse

或者要重复使用此<Ellipse x:Name="ellipse" Fill="{Binding ElementName=MainControl, Path=ButtonColor}" /> ,我们可以将Style属性绑定到Fill的{​​{1}}属性,如下所示:

Button

并在MainPage XAML中使用:

Background