附加行为处理WPF中的附加事件
我在谷歌上搜索了这个问题,但无法收集任何信息,我想知道附加行为是否有可能处理附加事件 我在一个类中声明了一个事件和一个附加到TextBox控件的行为,单击按钮时将引发该事件。我在我的行为中添加了该事件的处理程序,并在事件处理程序中编写了逻辑,但没有执行。所以,我想知道附加的行为是否可以处理附加的事件附加行为处理WPF中的附加事件,wpf,xaml,events,attachedbehaviors,Wpf,Xaml,Events,Attachedbehaviors,我在谷歌上搜索了这个问题,但无法收集任何信息,我想知道附加行为是否有可能处理附加事件 我在一个类中声明了一个事件和一个附加到TextBox控件的行为,单击按钮时将引发该事件。我在我的行为中添加了该事件的处理程序,并在事件处理程序中编写了逻辑,但没有执行。所以,我想知道附加的行为是否可以处理附加的事件 class ResetInputEventClass { 公共静态只读RoutedEvent ResetInputEvent=EventManager.RegisterRoutedEvent(“Re
class ResetInputEventClass
{
公共静态只读RoutedEvent ResetInputEvent=EventManager.RegisterRoutedEvent(“ResetInput”,
路由策略,泡沫,
类型(RoutedEventHandler),
类型(ResetInputEventClass));
公共静态void AddResetInputEventHandler(DependencyObject d,RoutedEventHandler)
{
uie元素uie=d作为uie元素;
if(uie==null)
{
回来
}
AddHandler(ResetInputEventClass.ResetInputEvent,handler);
}
公共静态void removesetinputEventHandler(DependencyObject d,RoutedEventHandler)
{
uie元素uie=d作为uie元素;
if(uie==null)
{
回来
}
RemoveHandler(ResetInputEventClass.ResetInputEvent,handler);
}
}
这是我的事件类,这是我在行为中处理它的方式
公共类MyBehavior:Behavior
{
公众行为
{
//在此点下方插入创建对象所需的代码。
}
受保护的覆盖无效附加()
{
base.onatached();
//插入行为附加到对象时要运行的代码。
ResetInputEventClass.AddResetInputEventHandler(关联对象,OnResetInputEvent);
}
附加时受保护的覆盖无效()
{
base.OnDetaching();
//插入要在从对象中删除行为时运行的代码。
ResetInputEventClass.RemoveResetInputEventHandler(关联对象,OnResetInputEvent);
}
private void OnResetInputEvent(对象o,RoutedEventArgs e)
{
//逻辑
}
}
以下是我的XAML代码:
<Grid x:Name="LayoutRoot">
<StackPanel>
<TextBox Margin="5" Text="Bye" TextWrapping="Wrap" Width="150">
<i:Interaction.Behaviors>
<local:MyBehavior/>
</i:Interaction.Behaviors>
</TextBox>
<TextBox Margin="5" Text="Bye" TextWrapping="Wrap" Width="150">
<i:Interaction.Behaviors>
<local:MyBehavior/>
</i:Interaction.Behaviors>
</TextBox>
<Button Name="MyButton" Content="Save" Width="50" Height="25" Click="MyButton_Click"/>
</StackPanel>
</Grid>
当然有可能。向我展示您的XAML,我会告诉您附加事件如何触发附加行为 已编辑: 我不认为有必要使用附加行为和附加事件,因为您可以在代码隐藏中完成所有操作
public MainWindow()
{
InitializeComponent();
}
private void MyButton_Click(object sender, RoutedEventArgs e)
{
this.txtBox.Text = "hello";
}
以下是如何在代码隐藏中执行所有操作:
以下是没有附加属性的XAML:
<Grid>
<StackPanel>
<TextBox x:Name="txtBox" Margin="5" Text="Bye" TextWrapping="Wrap" Width="150"/>
<Button Name="MyButton" Content="Save" Width="50" Height="25" Click="MyButton_Click"/>
</StackPanel>
</Grid>
因为您已经在文本框
和按钮
上设置了Name属性,所以您可以从Window.cs中的代码隐藏中访问它们,并且可以轻松编写处理程序
以下是使用附加属性执行所有操作的方法:
这是具有附加属性的解决方案的新XAML。我必须创建自定义交互,因为您使用的是Expression Blend或silverlight,而不是纯WPF
<Grid x:Name="LayoutRoot">
<StackPanel i:Interaction.Behaviour="True">
<TextBox x:Name="txtBox" Margin="5" Text="Bye" TextWrapping="Wrap" Width="150"/>
<Button Name="MyButton" Content="Save" Width="50" Height="25" Click="MyButton_Click"/>
</StackPanel>
</Grid>
当我将false
更改为true
时,将调用Inside property changed事件。当应用程序在后台时,我会告诉调度器执行我的代码,直到所有事情都初始化。然后,我找到文本框
,并注入在触发ResetInput
事件时将调用的处理程序
这是一个非常复杂的解决方案,但它可以处理附加的事件和附加的属性
我强烈建议您在此场景中使用代码隐藏。
您在ResetInputEventClass
类中也犯了一个错误。添加和删除方法拼写不正确
你应该这样写:
public static void AddResetInputHandler(DependencyObject d, RoutedEventHandler handler)
{
UIElement uie = d as UIElement;
if (uie == null)
{
return;
}
uie.AddHandler(ResetInputEventClass.ResetInputEvent, handler);
}
public static void RemoveResetInputHandler(DependencyObject d, RoutedEventHandler handler)
{
UIElement uie = d as UIElement;
if (uie == null)
{
return;
}
uie.RemoveHandler(ResetInputEventClass.ResetInputEvent, handler);
}
祝你玩得开心,我希望我帮了你
您也可以通过
命令实现这一点,您的问题很简单。textbox已为事件注册,但textbox的父级正在引发它。因此,永远不会调用处理程序。您可以更改事件,使其成为隧道事件,而不是冒泡事件。或者你可以在你的文本框上获得一个句柄(在代码隐藏中给它一个名称和引用)。并让它引发事件
<Grid x:Name="LayoutRoot">
<StackPanel>
<TextBox Margin="5" x:Name="byeTextBox" Text="Bye" TextWrapping="Wrap" Width="150">
<i:Interaction.Behaviors>
<local:MyBehavior/>
</i:Interaction.Behaviors>
</TextBox>
<Button Name="MyButton" Content="Save" Width="50" Height="25" Click="MyButton_Click"/>
</StackPanel>
</Grid>
这应该可以解决您的问题。您的完整xaml丢失了,我看不到按钮,它在哪里?那void-OnAttached()从哪里来?请发布一些正确的代码。OnAttached属于MyBehavior类,在这个类中,我正在添加处理程序(并在OnAttaching函数中删除处理程序),我已经更新了XAML代码。让我把它放在我的可视化研究中,只是想知道谁是这个答案的巨魔+我会反击的。+1会反击一些无言以对的巨魔。
<Grid x:Name="LayoutRoot">
<StackPanel>
<TextBox Margin="5" x:Name="byeTextBox" Text="Bye" TextWrapping="Wrap" Width="150">
<i:Interaction.Behaviors>
<local:MyBehavior/>
</i:Interaction.Behaviors>
</TextBox>
<Button Name="MyButton" Content="Save" Width="50" Height="25" Click="MyButton_Click"/>
</StackPanel>
</Grid>
private void MyButton_Click(object sender, RoutedEventArgs e)
{
RoutedEventArgs eventArgs = new RoutedEventArgs(ResetInputEventClass.ResetInputEvent,e.OriginalSource);
byeTextBox.RaiseEvent(eventArgs);
}