我试图通过代码创建一个元素并为其关联一个样式,还关联其EventSetter,该样式可以完美工作,但是当我尝试运行该功能时,该样式不起作用。
App.xaml
<Application x:Class="Learning.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Learning">
<Application.Resources>
<Style TargetType="Label" x:Key="LabelTituloEstiloPadrao">
<Setter Property="Background" Value="White" />
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="Margin" Value="40,20,0,0" />
<EventSetter Event="MouseLeftButtonUp" Handler="lbl_MouseLeftButtonUp"/>
<EventSetter Event="MouseRightButtonUp" Handler="lbl_MouseRightButtonUp"/>
</Style>
</ResourceDictionary>
</Application.Resources>
</Application>
MainWindow.xaml.cs
public ViewConfigAgendaDin()
{
InitializeComponent();
ConfigInicial();
Label l = new Label();
lblTeste.Style = (Style)App.Current.Resources["LabelTituloEstiloPadrao"];
StackHorarios.Children.Add(l);
}
private void lbl_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("Right");
}
public void lbl_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("Left");
}
在构建应用程序时,EventSetter中会引发两个错误
错误CS1061“应用”不包含以下设置 “ lbl_MouseLeftButtonUp”,找不到任何“ lbl_MouseLeftButtonUp” 扩展方法,它接受类型为“ App”的第一个参数(是否存在 使用指令或程序集引用丢失了?)
对于正确的事件,也会发生相同的错误,我该如何在我使用此类的类中实现这两个方法而又不会出现问题?
答案 0 :(得分:1)
通常,当无法从XAML访问方法时,会出现错误CS1061 。
最常见的情况是:
x:Class
标记与类的实际名称不匹配Handler
不匹配的方法的名称private
类中使用base
方法而不是protected
查看XAML代码,您的类名称为Learning.App
<Application x:Class="Learning.App"
但是在其中声明事件处理程序的代码为ViewConfigAgendaDin
public class ViewConfigAgendaDin
您不能将事件处理程序放在任何地方,并且希望编译器自己找到它们。由于处理程序是在App.XAML
中使用的,因此您需要将事件处理程序移至App.xaml.cs
,这样会很好。
如果您需要将它们放在ViewConfigAgendaDin
类中,请在Style
中定义ViewConfigAgendaDin.xaml
或从ViewConfigAgendaDin.xaml.cs
来调用App.xaml.cs
中的方法
例如:
ViewConfigAgendaDin.xaml:
<ViewConfigAgendaDin
xmlns:v="clr-namespace:MY_NAMESPACE">
...
<Label Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type v:ViewConfigAgendaDin}}}"
Style="{StaticResource LabelTituloEstiloPadrao}"/>
...
</ViewConfigAgendaDin>
ViewConfigAgendaDin.xaml.cs:
public void MyMethodForRightClick(object sender, MouseButtonEventArgs e)
{
MessageBox.Show("Right");
}
App.xaml.cs:
private void lbl_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
{
((sender as Label).Tag as ViewConfigAgendaDin).MyMethodForRightClick(sender, e);
}
处理这种情况的另一种方法是完全避免代码落后。而是使用 MVVM 和 Command 绑定。您可以使用 Interactions
轻松将任何事件绑定到命令