附加行为处理WPF中的附加事件

附加行为处理WPF中的附加事件,wpf,xaml,events,attachedbehaviors,Wpf,Xaml,Events,Attachedbehaviors,我在谷歌上搜索了这个问题,但无法收集任何信息,我想知道附加行为是否有可能处理附加事件 我在一个类中声明了一个事件和一个附加到TextBox控件的行为,单击按钮时将引发该事件。我在我的行为中添加了该事件的处理程序,并在事件处理程序中编写了逻辑,但没有执行。所以,我想知道附加的行为是否可以处理附加的事件 class ResetInputEventClass { 公共静态只读RoutedEvent ResetInputEvent=EventManager.RegisterRoutedEvent(“Re

我在谷歌上搜索了这个问题,但无法收集任何信息,我想知道附加行为是否有可能处理附加事件

我在一个类中声明了一个事件和一个附加到TextBox控件的行为,单击按钮时将引发该事件。我在我的行为中添加了该事件的处理程序,并在事件处理程序中编写了逻辑,但没有执行。所以,我想知道附加的行为是否可以处理附加的事件

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);
        }