我使用表达式混合制作了一个自定义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);
}
但我无法这样做,按钮中没有反映任何变化。 有什么办法吗? 我知道我必须改变矩形的颜色。但不知道该怎么做。 我尝试了很多。 感谢。
答案 0 :(得分:2)
那么,哪些属性会影响哪个?您为按钮创建了自定义控件模板,这意味着您可以决定如何绘制它。如果您看一下自己的模板,那么您的按钮就会包含一个Grid
,其中包含两个子控件:Rectangle
和ContentPresenter
。
现在,当你说:
var btn = new Button
{
Background = new SolidColorBrush(Color.Blue);
};
什么应该变成蓝色? Grid
? Rectangle
控件?ContentPresenter
ControlTemplate
?这个问题原则上不负责任,你需要决定Button
中哪个控件继承父母的属性。
换句话说:ControlTemplate
的属性会通过TemplateBinding
转移到Button.Background
的控件中。因此,如果您想将Rectangle.Background
的含义转移到<Rectangle RadiusY="21" RadiusX="20" Stroke="White"
Fill="{TemplateBinding Background}"/>
,则可以将模板更改为:
Button.Background
现在你得到的东西可能就是你想要的。当您设置Button
时,您只需将其传输到目标子控件,因为可视化树中没有{{1}},它将被其控件模板替换。