WPF动态添加触发器

请教wpf动态给按钮添加触发器方法.
以下在用模板赋值时,按钮没有显示

Button btn = new Button();
           btn.Height = 300;
            btn.Width= 200;
            btn.Content = "OK";
            ControlTemplate template = new ControlTemplate(btn.GetType());
            Setter setter = new Setter();
            setter.Property = ForegroundProperty;
            setter.Value = Brushes.Gray;
            Trigger trigger = new Trigger();
           trigger.Property = Button.IsEnabledProperty;
            trigger.Value = true;
            trigger.Setters.Add(setter);
            template.Triggers.Add(trigger);
           btn.Template = template;//去掉这行可以显示
           stack.Children.Add(btn);//stack为前台容器名称

参考GPT和自己的思路:根据你提供的代码和问题描述,我可以看出你的问题出在了控件模板的设置上。当你给按钮添加控件模板后,你需要手动对其进行设置,否则控件将不会正确显示。因此,正确的代码应该是:

Button btn = new Button();
btn.Height = 300;
btn.Width= 200;
btn.Content = "OK";
ControlTemplate template = new ControlTemplate(btn.GetType());
Setter setter = new Setter();
setter.Property = ForegroundProperty;
setter.Value = Brushes.Gray;
Trigger trigger = new Trigger();
trigger.Property = Button.IsEnabledProperty;
trigger.Value = true;
trigger.Setters.Add(setter);
template.Triggers.Add(trigger);
btn.Template = template;

//手动设置控件模板
btn.ApplyTemplate();

stack.Children.Add(btn);

通过调用btn.ApplyTemplate()方法,可以手动对按钮进行控件模板的设置,从而保证控件能够正确显示。希望我的回答对你有所帮助!

哎,CSDN这些自动回复真是害人精,都解决不了问题也在抢先回复 ,都没人理了

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/364105
  • 你也可以参考下这篇文章:WPF实现自定义横向、纵向滚动条及鼠标移入移出切换显示隐藏状态
  • 除此之外, 这篇博客: WPF 去边框 自定义窗体 拖动窗体大小变化中的 WPF 去边框 自定义窗体 拖动窗体大小变化 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • wpf 自定义窗体 并 拖动窗体大小变化 网上普遍 实现都是 win32那一套或者用windowChrome.Shell这两种方式。实际上wpf目前已经集成了windowChrome。那么新的使用方式怎么弄呢?非常简单!

    Xaml实现代码

    后台都不用写任何代码哟!

    <Window x:Class="TestNoBorderWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            Title="TestNoBorderWindow"
            Width="300"
            Height="300"
            MinWidth="100"
            MinHeight="100"
            mc:Ignorable="d">
        <Window.Style>
            <Style TargetType="Window">
                <Setter Property="Background" Value="Transparent" />
                <Setter Property="WindowStyle" Value="None" />
                <Setter Property="ResizeMode" Value="CanResize" />
                <Setter Property="AllowsTransparency" Value="True" />
                <Setter Property="WindowChrome.WindowChrome">
                    <Setter.Value>
                        <WindowChrome CaptionHeight="30" ResizeBorderThickness="20" />
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Style>
        <Border Margin="10"
                Background="White"
                BorderBrush="Red"
                BorderThickness="1"
                CornerRadius="5"
                SnapsToDevicePixels="True">
            <Border.Effect>
                <DropShadowEffect BlurRadius="10"
                                  Direction="0"
                                  ShadowDepth="0" />
            </Border.Effect>
            <Grid />
        </Border>
    </Window>
    

    当然你也可以直接写成Window的Style

    <Window x:Class="TestNoBorderWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            Title="TestNoBorderWindow"
            Width="300"
            Height="300"
            MinWidth="100"
            MinHeight="100"
            mc:Ignorable="d">
        <Window.Style>
            <Style TargetType="Window">
                <Setter Property="Background" Value="Transparent" />
                <Setter Property="WindowStyle" Value="None" />
                <Setter Property="ResizeMode" Value="CanResize" />
                <Setter Property="AllowsTransparency" Value="True" />
                <Setter Property="WindowChrome.WindowChrome">
                    <Setter.Value>
                        <WindowChrome CaptionHeight="30" ResizeBorderThickness="20" />
                    </Setter.Value>
                </Setter>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Window">
                            <Border Padding="10">
                                <Border Background="White"
                                        BorderBrush="Red"
                                        BorderThickness="1"
                                        CornerRadius="5"
                                        SnapsToDevicePixels="True">
                                    <Border.Effect>
                                        <DropShadowEffect BlurRadius="10"
                                                          Direction="0"
                                                          ShadowDepth="0" />
                                    </Border.Effect>
                                    <ContentPresenter />
                                </Border>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Window.Style>
    </Window>
    

    先看看GIF

    这里写图片描述

  • 您还可以看一下 徐杨老师的WPF上位机通用通用框架实战课程中的 025-主窗口-按钮显示问题与触发器样式小节, 巩固相关知识点