1

我使用表达式混合制作了一个自定义按钮并将其粘贴到我的 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);

    }

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

4

1 回答 1

2

那么,哪些属性应该影响哪些?您为按钮创建了一个自定义控件模板,这意味着您可以决定如何绘制它。如果您看一下您的模板,您的按钮由 aGrid和两个子控件组成: aRectangle和 a ContentPresenter

现在,当你说:

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

什么应该变成蓝色?Grid? _ Rectangle控制?ContentPresenter? 这个问题原则上是无法回答的,您需要决定ControlTemplate继承父级属性中的哪个控件。

换句话说:Button的属性被传递到ControlTemplatevia中的控件TemplateBinding。因此,如果您想转移 to 的含义Button.BackgroundRectangle.Background您可以将模板更改为:

<Rectangle RadiusY="21" RadiusX="20" Stroke="White"
            Fill="{TemplateBinding Background}"/>

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

于 2013-09-03T07:07:58.570 回答