【问题标题】:WPF adding style triggers dynamicallyWPF 动态添加样式触发器
【发布时间】:2021-08-13 14:13:36
【问题描述】:

我试图动态地将一些 WPF 事件添加到我的控件中。我也尝试在 Loaded 事件之外添加事件,但当时样式为空。我不知道该怎么办。

这是我的代码:

public tagged_button()
{

    InitializeComponent();

    this.Loaded += delegate
    {

        Setter setter = new Setter();
        setter.Property = tagged_button.BackgroundProperty;
        setter.Value = Brushes.Red;

        Trigger trigger = new Trigger();
        trigger.Property = UIElement.IsMouseOverProperty;
        trigger.Value = true;
        trigger.Setters.Add(setter);

        Style style = this.Style;
        style.Triggers.Add(trigger);

        this.Style.Triggers.Add(trigger);

    };

}

但是我得到了这个错误。 :

System.InvalidOperationException
  HResult=0x80131509

  Translated to English: "After a 'TriggerCollection' is in use (sealed), it cannot be modified."

  StackTrace:
   at System.Windows.TriggerCollection.CheckSealed()
   at System.Windows.TriggerCollection.InsertItem(Int32 index, TriggerBase item)
   at System.Collections.ObjectModel.Collection`1.Add(T item)
   at UI_Deneme.user_controls.tagged_button.<.ctor>b__4_0(Object <p0>, RoutedEventArgs <p1>)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   ...

我认为我不应该在“加载”事件之后添加该触发器,但我不知道何时添加它。我应该什么时候添加触发器?

【问题讨论】:

标签: c# .net wpf


【解决方案1】:

new Style(Type, Style)

您需要复制样式。 修改这个副本。 并把它写下来,而不是原来的。

    Style styleCopy = new Style(GetType(), Style);
    styleCopy.Triggers.Add(trigger);
    Style = styleCopy;

附注我会澄清的。
这不是样式的复制,而是针对当前Window的类型,并基于此Window使用的当前样式创建新样式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多