我在WPF项目中使用.net 4.5。我想提出一个TextBox TextChangedEvent。这就是我所做的:
tb.RaiseEvent(new RoutedEventArgs(TextBox.TextChangedEvent));
之前我在Button.ClickEvent上做了同样的RaiseEvent,我怎么能这样做呢?
这会产生如下错误:
异常:抛出:"类型为&System;对象的对象:System.Windows.RoutedEventArgs' 无法转换为类型 ' System.Windows.Controls.TextChangedEventArgs'" (System.ArgumentException)抛出了System.ArgumentException: "类型对象&Systems.Windows.RoutedEventArgs'无法转换 输入' System.Windows.Controls.TextChangedEventArgs'。"
[编辑]
更改的实际文本框文本由附加行为处理,如下所示。我想以编程方式引发事件的地方是另一个控件的附加行为。在后来的行为中,我确实有文本框对象。
public class textboxTextChangedBehavior : Behavior<TextBox>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.TextChanged += OnTextChanged;
}
protected override void OnDetaching()
{
AssociatedObject.TextChanged -= OnTextChanged;
base.OnDetaching();
}
private void OnTextChanged(object sender, TextChangedEventArgs args)
{
var textBox = (sender as TextBox);
if (textBox != null)
{
//Populate ObservableCollection
}
}
}
我试图举起活动的地方:
public class FindPopupBehavior : Behavior<Popup>
{
protected override void OnAttached()
{
AssociatedObject.Opened += _OpenFindPopup;
}
protected override void OnDetaching()
{
AssociatedObject.Opened -= _OpenFindPopup;
}
void _OpenFindPopup(object sender, EventArgs e)
{
//Fake a TextBox text changed event
if (TextBoxObject == null)
return;
TextBox tb = TextBoxObject as TextBox;
if (tb.Text == "")
return;
tb.RaiseEvent(new RoutedEventArgs(TextBox.TextChangedEvent));
}
public static readonly DependencyProperty TextBoxProperty =
DependencyProperty.Register("TextBoxObject", typeof(TextBox), typeof(FindPopupBehavior), new UIPropertyMetadata(null));
public object TextBoxObject
{
get { return (object)GetValue(TextBoxProperty); }
set { SetValue(TextBoxProperty, value); }
}
}
[EDIT2]
文本框位于此弹出窗口的弹出窗口中,关闭ObservableCollection,文本框文本保留,尽管隐藏。如果重新打开弹出窗口并且文本框中有文本,则需要重新填充ObservableCollection。它在textchanged行为中执行此填充。这就是为什么我想假装一个事件。
答案 0 :(得分:2)
手动提升.NET事件是不可取的,即使没有其他原因也不需要。想一想......你真的 想要举办活动。你不是在寻求事件的功能,为什么要提高它呢?
如果我能正确理解您的情况,那么您实际想要做的就是执行代码的特定部分。因此,您的问题是由于该部分代码当前封装在事件处理程序中引起的。但是,并不意味着您必须提升该事件才能执行该代码。
相反,只需将相关代码移动到一个方法中,您可以从任何您想要的地方通过事件处理程序和调用这些方法,而不必不必要地提出任何事件:
private void OnTextChanged(object sender, TextChangedEventArgs args)
{
var textBox = (sender as TextBox);
if (textBox != null)
{
PopulateObservableCollection();
}
}
private void PopulateObservableCollection()
{
// Populate ObservableCollection
}
如果您特别需要访问TextBox
,请进一步描述您的情况...... 总是一种方式。
更新&gt;&gt;&gt;
从逻辑上考虑一下......您想要调用此方法,并且需要访问TextBox
中的Popup
,并且每次打开Popup
时都需要执行此操作。那么为什么不处理Popup.Opened
Event?:
private void PopupOpened(object sender, EventArgs e)
{
// Check TextBox and Populate ObservableCollection
}
答案 1 :(得分:1)
您可以手动举起活动,例如
MouseButtonEventArgs args = new MouseButtonEventArgs(Mouse.PrimaryDevice,100, MouseButton.Left);
args.RoutedEvent = UIElement.PreviewMouseLeftButtonUpEvent;
tb.RaiseEvent(args);
答案 2 :(得分:0)
一种方法是你可以这样做..
EventName.Raise(this, new EventArgs());
答案 3 :(得分:0)
为什么不直接调用事件的方法? 我为您创建了一个小样本应用程序:
它执行以下操作:
首先,你的WPF应用程序,在我的情况下,只包含一个网格,里面有一个文本框和一个按钮。
<Grid>
<TextBox Name="txtTextBox"></TextBox>
<Button Name="btnDemo" Content="Click me"></Button>
</Grid>
我知道布局明智,这是垃圾,但它只是为了展示。
在你的代码背后,你需要做一些事情:
为按钮和文本框添加事件处理程序:
public MainWindow()
{
InitializeComponent();
btnDemo.Click += BtnDemoOnClick;
txtTextBox.TextChanged += TxtTextBoxOnTextChanged;
}
以下是TxtTextBoxOnTextChanged事件的代码:
private void TxtTextBoxOnTextChanged(object sender, TextChangedEventArgs textChangedEventArgs)
{
MessageBox.Show("The textbox event has been fired.");
}
如您所见,这只会显示一个消息框。
然后是你的按钮事件:
private void BtnDemoOnClick(object sender, RoutedEventArgs routedEventArgs)
{
TxtTextBoxOnTextChanged(this, new TextChangedEventArgs(routedEventArgs.RoutedEvent, UndoAction.None));
}
我希望它有所帮助。
答案 4 :(得分:0)
这可能会在stackoverflow中结束,因为如果为您的对象调用事件,它将再次被您的textboxTextChangedBehavior
因此,您可以轻松更改
,而不是创建循环private void OnTextChanged(object sender, TextChangedEventArgs args)
{
var textBox = (sender as TextBox);
if (textBox != null)
{}
}
到
private void OnTextChanged(object sender, TextChangedEventArgs args)
{
var textBox = (sender as TextBox);
if (textBox != null)
{}
// now your textboxTextChangedBehavior does't block your event
args.Handled = false;
}
但是如果我理解你的弹出窗口Opened
而你试图提升TextChanged
,对吧?
因此您可以在_OpenFindPopup
(添加#或其他任何内容)中设置文字,这将提升您的TextChanged
,现在您可以移除#并填充您的ObservableCollection