请教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这些自动回复真是害人精,都解决不了问题也在抢先回复 ,都没人理了
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