以编程方式在xaml按钮上设置样式失败

时间:2015-01-11 13:51:37

标签: c# asp.net xaml silverlight

我正在制作一个控件。需要使用外部源的输入设置此控件的样式。我找了解决方案,发现了一些没有破解代码的解决方案。然而,它没有造型按钮。我将样式设置为资源。在按钮上应用它的引用。初始化内容,但不应用样式。

     public MainPage()
    {

        //String[] settings = Application.Current.Resources["settings"].ToString().Split(new Char[1] { '\u003A' });

        String[] settings = "_icons/pngp/2933.png:1:ff0000:Select files from disk...:36:36".Split(new Char[1] { '\u003A' });

        //style the dialog button
        ImageBrush image = new ImageBrush();
        image.ImageSource = new BitmapImage(new Uri(settings[0], UriKind.Relative));
        Button dialogButton = new Button();

        dialogButton.Background = image;

        var styleOverride = new Style(typeof(Button)) ;
        styleOverride.Setters.Add(new Setter(Border.CornerRadiusProperty, new CornerRadius(0)));
        styleOverride.Setters.Add(new Setter(Border.BorderBrushProperty, colorConverter(settings[2])));
        styleOverride.Setters.Add(new Setter(Border.BorderThicknessProperty, new Thickness(double.Parse(settings[1]))));
        this.Resources.Add("key", styleOverride);

        dialogButton.Style = this.Resources["key"] as Style;
        dialogButton.Height = double.Parse(settings[4]);
        dialogButton.Width = double.Parse(settings[5]);
        //attach the click handler;
        dialogButton.Click += dialogButton_Click;

        ToolTip tooltip = new ToolTip();
        tooltip.Content = settings[3];

        ToolTipService.SetToolTip(dialogButton, tooltip);


        this.InitializeComponent();

        this.LayoutRoot.Children.Add(dialogButton);
        this.LayoutRoot.Drop += this.Canvas_Drop;
    }

我已经对settings字符串进行了硬编码。通常这是动态的,来自外部资源。问题是为什么dialogButton.Style = this.Resources["key"] as Style;没有应用所需的样式效果?

图像现在显示结果(左)和所需效果(右)。没有圆形边框和不同的边框颜色。不,红色不会成为最终的颜色。它是用于调试的。

enter image description here

3 个答案:

答案 0 :(得分:1)

您的代码中存在两个问题。

首先,您使用的Border.BorderBrushPropertyBorder.BorderThicknessProperty不是Button控件中的依赖项属性。您应该将它们分别更改为Button.BorderBrushPropertyButton.BorderThicknessProperty,如下所示 -

styleOverride.Setters.Add(new Setter(Button.BorderBrushProperty, colorConverter(settings[2])));
styleOverride.Setters.Add(new Setter(Button.BorderThicknessProperty, new Thickness(double.Parse(settings[1]))));

第二个问题是CornerRadius控件中没有Button依赖属性。因此,您不能简单地将其更改为Button.CornerRadiusProperty

解决方法是,在您的网页中定义本地Button Style,然后使用TemplateBinding绑定CornerRadius的{​​{1}}( Border ControlTemplate的{​​{1}}到Button依赖属性。这部分在xaml中更容易完成。

Tag

然后,您只需将CornerRadius="{TemplateBinding Tag}" 应用为覆盖Style的{​​{1}},然后更新BaseOn属性。

Style

此处附加完整的xaml Tag var styleOverride = new Style(typeof(Button)) { BasedOn = (Style)this.Resources["ButtonStyle1"] }; styleOverride.Setters.Add(new Setter(Button.TagProperty, new CornerRadius(0)));

Button

我测试了代码,结果正是您所期望的。

希望这有帮助!

答案 1 :(得分:0)

不要直接在代码中设置Style:

dialogButton.Style = this.Resources["key"] as Style;

但使用SetValue方法:

var style = this.Resources["key"] as Style; // or this.TryFindResource("key") as Style;
dialogButton.SetValue(StyleProperty, style);

答案 2 :(得分:0)

似乎应用了样式,但红色边框覆盖了png。 尝试评论一下:

/* styleOverride.Setters.Add(new Setter(Border.BorderBrushProperty, colorConverter(settings[2]))); */

现在背景图像变得可见。 也许解决方案是使用边距将图像大小调整为40x40像素?