事件设置器不能用于主题资源字典中包含的样式.这是因为运行时的主题资源字典通常是松散的二进制XAML(BAML)文件,并且没有定义任何范围,其中定义处理程序的后续代码隐藏可以存在.
这个SO问题的第一个答案证实了这一点,该问题指出:
资源xaml不能有文件后面的代码,它们通常被称为"松散的xaml".您可以在msdn中了解有关EventSetter的内容.
但是,我还不了解事件设定者的限制.我尝试使用代码隐藏文件作为资源字典.我为在所述资源字典中的样式中定义的模板中包含的控件事件分配了一个事件处理程序 - 并且它起作用.
另一方面,将事件设置器添加到同一资源字典中的样式会导致异常.
我是否遇到了碰巧工作的特殊情况?
或者在模板中设置事件处理程序始终有效,但如果是这样,那么为什么我不能在同一资源字典中的样式中使用事件设置器?
我的问题归结为:
MSDN声明主题资源字典通常是松散的二进制XAML 究竟是什么意思- 在什么情况下究竟是什么时候?
我有几个项目控件,只有在满足某个条件时才需要为其PreviewMouseLeftButtonDown事件附加一个事件处理程序.
我用一个数据触发器为我的控件设计了一个样式,我检查了它的绑定并尝试使用BorderThickness属性的常规属性设置器来查看数据触发器的工作原理.(确实......)
当使用事件设置器以与常规属性设置器相同的方式满足datatrigger的条件时,如何应用我的datatrigger来附加事件处理程序?
类似的东西:
<Style TargetType="{x:Type ItemsControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding Turn}" Value="True">
<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ItemsControl_MouseLeftButtonDown"></EventSetter>
</DataTrigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
此标记在eventsetter行上抛出以下异常:
'Set property 'System.Windows.EventSetter.Event' threw an exception.'
Run Code Online (Sandbox Code Playgroud)
内在例外:
{"Value cannot be null.\r\nParameter name: value"}
Run Code Online (Sandbox Code Playgroud) 在将 WPF 项目从 .NET Framework 移植到 .NET Core 时,我在 VS2019 (v16.3.10) 中遇到了 XAML-Designer 的问题。当我尝试在样式中使用 EventSetter 时,它不断抛出“XDG0062”错误。代码编译并运行良好,但错误导致设计器中的相关元素被带有 X 的红色圆圈替换,使得设计 UI 变得相当困难。相同的 XAML 在 .NET 框架 4.7.2 中运行良好。项目。
为了追查问题,我从头开始制作了一个 VS 最小项目(WPF .NET Core),问题也出现在这里(请参阅下面的错误和代码)。这似乎是由在样式中使用 EventSetter 引起的 - 不幸的是我不知道为什么。谷歌在没有解决方案的情况下提到了这个问题,Stack Overflow 有一个关于这个错误代码的主题,但是,那里建议的解决方案(删除 VS 缓存)没有帮助。删除 EventSetter 行会删除这两个错误消息。
有没有人有解决这个问题的建议?
完整的错误信息:
第 9 行:“EventSetter.Handler”所需的 XDG0062 非 NULL 值
第 12 行:XDG0062 值不能为空。(参数“typeDescriptorContext”)
XAML
<Window x:Class="XDG0062_test.MainWindow"
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"
xmlns:local="clr-namespace:XDG0062_test"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<Style TargetType="TextBox">
<Setter Property="Height" Value="30"></Setter>
<Setter Property="Width" Value="130"></Setter>
<EventSetter Event="GotFocus" Handler="TextBox_GotFocus" />
</Style> …Run Code Online (Sandbox Code Playgroud) 我有两个组件,Parent Component并且Child component有一个在 中发生的 API Parent component,并且响应值被传递到child component。目前我正在使用,ngOnChanges但我想知道如何使用Setters。
假设ParentComponent我有以下代码:
<ChildComponent [apiResponse]="res" />
Run Code Online (Sandbox Code Playgroud)
在ChildComponent我有这个:
@Input() apiResponse: any;
ngOnChanges(changes: SimpleChanges) {
console.log(this.apiResponse)
}
Run Code Online (Sandbox Code Playgroud)
每次apiResponse更改时,该ngOnChanges函数都会触发并在控制台中打印该值。
如果我想达到结果但使用 if Setters。与其他情况一样,我可能有多个输入,并且我不想ngOnChanges每次输入值更改时都被解雇。
一个完整的例子
public delegate void mouseup_delegate(object obj, MouseButtonEventArgs args);
constructor()
{
TextBlock text_block = new TextBlock() { Text = "aa" };
Style style = new Style();
//style.Setters.Add(new EventSetter(){Event=TextBlock.MouseUpEvent, Handler=new mouseup_delegate(this.textblockClicked)});
style.Setters.Add(new EventSetter(TextBlock.MouseUpEvent, new mouseup_delegate(this.textblockClicked)));
text_block.Style = style;
}
public void textblockClicked(object sender, MouseButtonEventArgs args)
{
MessageBox.Show("mouse up");
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行应用程序时,会出现异常:处理程序类型无效
这段代码有什么问题?
eventsetter ×5
wpf ×4
angular ×1
c# ×1
datatrigger ×1
delegates ×1
designer ×1
setter ×1
styles ×1
xaml ×1