【问题标题】:Customize WPF Button Style Programmatically以编程方式自定义 WPF 按钮样式
【发布时间】:2017-12-06 08:12:56
【问题描述】:

在 WPF 项目中,使用以下代码在 Window_Loaded 事件中自定义按钮:

Dim style As Style = New Style
style.TargetType = GetType(Button)
Dim trigger As DataTrigger = New DataTrigger
trigger.Value = "OK"

'set binding
Dim bi As New Binding
Dim pp As New PropertyPath("Content")
bi.Path = pp
bi.RelativeSource = RelativeSource.Self
trigger.Binding = bi ' New Binding(pp.Path)
Dim setter As Setter = New Setter
setter.Property = Button.BackgroundProperty
setter.Value = Brushes.Red
trigger.Setters.Add(setter)

'clear the triggers
style.Triggers.Clear()
style.Triggers.Add(trigger)
btn_Step.Style = style

编译正常,但按钮没有明显变化。我怎样才能应用它?

【问题讨论】:

  • 有没有理由不在 xaml 中执行此操作?
  • 感谢您的回复。答案是按钮在运行时才存在(它是动态/以编程方式创建的)。
  • @swabygw,我建议在 window.resources 中声明按钮样式,在某个测试按钮上对其进行调试,然后将样式从资源应用到动态按钮(例如 btn_Step.Style = (Style)Resources["MyButtonsStyle"]
  • 好的 - 我想过这样做,但后来我也认为这也必须是一种编程方式。但是你的建议意味着可能没有办法对其进行编程,所以我也会尝试这条路线。
  • 我尝试了你的想法,它在 XAML 中工作,但无法让它在代码中切换:btn_Step.Style = Style.Resources("MyButton"),尽管我已将模板放在Windows.Resource 正确。你知道正确的命令是什么吗?

标签: wpf vb.net button styles customization


【解决方案1】:

我想出了如何使用代码来实现 - 这是我的最终解决方案:

Public Function CreateStyle(ByVal clr1 As SolidColorBrush, ByVal clr2 As SolidColorBrush)

    Dim st As New Style
    st.TargetType = GetType(Button)
    Dim se0 As New Setter
    se0.Property = Button.OverridesDefaultStyleProperty
    se0.Value = True
    st.Setters.Add(se0)
    Dim se1 As New Setter
    se1.Property = TemplateProperty

    Dim ct As New ControlTemplate
    'Reference: https://social.msdn.microsoft.com/Forums/vstudio/en-US/ddb7fd77-dea1-40f5-a5b7-30d35ecda70e/creating-a-control-template-with-code-behind?forum=wpf
    ct.TargetType = GetType(Button)
    Dim fef0 As New FrameworkElementFactory(GetType(Border))
    fef0.Name = "Border"
    fef0.SetValue(Border.BorderThicknessProperty, New Thickness(1))
    fef0.SetValue(Border.BorderBrushProperty, Brushes.Black)
    ct.VisualTree = fef0

    Dim fef1 As New FrameworkElementFactory(GetType(ContentPresenter))
    fef1.SetValue(HorizontalAlignmentProperty, HorizontalAlignment.Center)
    fef1.SetValue(VerticalAlignmentProperty, VerticalAlignment.Center)
    fef0.AppendChild(fef1)

    Dim tr0 As New Trigger
    tr0.Property = Button.IsMouseOverProperty
    tr0.Value = True
    Dim se2 As New Setter
    se2.TargetName = "Border"
    se2.Property = Button.BackgroundProperty
    se2.Value = clr1
    tr0.Setters.Add(se2)
    ct.Triggers.Add(tr0)

    Dim tr1 As New Trigger
    tr1.Property = Button.IsMouseOverProperty
    tr1.Value = False
    Dim se3 As New Setter
    se3.TargetName = "Border"
    se3.Property = Button.BackgroundProperty
    se3.Value = clr2
    tr1.Setters.Add(se3)
    ct.Triggers.Add(tr1)

    se1.Value = ct
    st.Setters.Add(se1)

    Return st

End Function

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多