我正在制作一个控件。需要使用外部源的输入设置此控件的样式。我找了解决方案,发现了一些没有破解代码的解决方案。然而,它没有造型按钮。我将样式设置为资源。在按钮上应用它的引用。初始化内容,但不应用样式。
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;
没有应用所需的样式效果?
图像现在显示结果(左)和所需效果(右)。没有圆形边框和不同的边框颜色。不,红色不会成为最终的颜色。它是用于调试的。
答案 0 :(得分:1)
您的代码中存在两个问题。
首先,您使用的Border.BorderBrushProperty
和Border.BorderThicknessProperty
不是Button
控件中的依赖项属性。您应该将它们分别更改为Button.BorderBrushProperty
和Button.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像素?