如何在运行时更改XAML中设计的自定义按钮的背景颜色?

时间:2013-09-03 06:35:27

标签: c# windows-phone-7

我使用表达式混合制作了一个自定义Button,并将其粘贴到我的xaml代码中。

<phone:PhoneApplicationPage.Resources>
 <Style x:Key="ButtonStyle1" TargetType="Button">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Grid>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal"/>
                                <VisualState x:Name="Disabled"/>
                                <VisualState x:Name="MouseOver"/>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="FocusStates">
                                <VisualState x:Name="Focused"/>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <Rectangle RadiusY="21" RadiusX="20" Stroke="White"/>
                        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
 </Style>
</phone:PhoneApplicationPage.Resources>

然后我在我的c#代码中使用了这个资源来动态地改变颜色,字体大小,背景,前景和所有属性。

 public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        InitializeComponent();
        createButton();
    }
    public void createButton()
    {            
        Button buttton = new Button { Height = 100, Background = new SolidColorBrush(Colors.Blue), Width = 300,  Content = " Button", Style = this.Resources["ButtonStyle1"] as Style };                  
        ContentPanel.Children.Add(buttton);

    }

但我无法这样做,按钮中没有反映任何变化。 有什么办法吗? 我知道我必须改变矩形的颜色。但不知道该怎么做。 我尝试了很多。  感谢。

1 个答案:

答案 0 :(得分:2)

那么,哪些属性会影响哪个?您为按钮创建了自定义控件模板,这意味着您可以决定如何绘制它。如果您看一下自己的模板,那么您的按钮就会包含一个Grid,其中包含两个子控件:RectangleContentPresenter

现在,当你说:

var btn = new Button
{
    Background = new SolidColorBrush(Color.Blue);
};

什么应该变成蓝色? GridRectangle控件?ContentPresenter ControlTemplate?这个问题原则上不负责任,你需要决定Button中哪个控件继承父母的属性。

换句话说:ControlTemplate的属性会通过TemplateBinding转移到Button.Background的控件中。因此,如果您想将Rectangle.Background的含义转移到<Rectangle RadiusY="21" RadiusX="20" Stroke="White" Fill="{TemplateBinding Background}"/> ,则可以将模板更改为:

Button.Background

现在你得到的东西可能就是你想要的。当您设置Button时,您只需将其传输到目标子控件,因为可视化树中没有{{1}},它将被其控件模板替换。