向富文本框组件添加事件
Adding events to rich textbox components
我正在尝试将事件添加到我每次在富文本框中创建的标签。这是下面的代码。
在我的 class MainWindowController 中我有:
public static Window MainWindow = new Windows.MainWindow();
public static Pages.MainPage MainPage = new Pages.MainPage();
public static Pages.LoginPage LoginPage = new Pages.LoginPage();
public static FlowDocument ChatDocument = new FlowDocument();
public static Paragraph ChatParagraph = new Paragraph();
在另一个 class 中,我有这个方法,每次客户端通过网络收到更新状态消息时我都会调用它。
private static void HandleStatus(string MessageString)
{
string Sender = AuxiliaryClientWorker.GetElement(MessageString, "-U ", " -Content");
string Message = AuxiliaryClientWorker.GetElement(MessageString, "-Content ", ".");
MainWindowController.MainWindow.Dispatcher.Invoke(() =>
{
#region Status updater
System.Windows.Controls.Label StatusLabel = new System.Windows.Controls.Label();
StatusLabel.FontSize = 18;
StatusLabel.FontStyle = FontStyles.Oblique;
StatusLabel.FontStyle = FontStyles.Italic;
StatusLabel.Foreground = System.Windows.Media.Brushes.Black;
StatusLabel.Content = Sender + " has updated their status to " + Message;
StatusLabel.MouseEnter += StatusLabel_MouseEnter;
#endregion
MainWindowController.ChatParagraph.Inlines.Add(StatusLabel);
MainWindowController.ChatParagraph.Inlines.Add(Environment.NewLine);
MainWindowController.ChatDocument.Blocks.Add(MainWindowController.ChatParagraph);
MainWindowController.MainPage.ClientChatTextBox.Document = MainWindowController.ChatDocument;
});
}
private static void StatusLabel_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
MessageBox.Show("This");
}
一切正常,唯一的问题是富文本框中的 UI 元素不“侦听”事件,此后事件永远不会触发。 MessageBox 从不显示。我尝试将 Dispatcher.Invoke 命令添加到下面的方法中,但它只是拒绝工作并且事件永远不会触发。我希望你们都明白我在做什么!
TLDR: StatusLabel_MouseEnter never fires
您需要在 RichTextBox 上将 IsDocumentEnabled
属性 设置为 true。
Gets or sets a value that indicates whether the user can interact with UIElement and ContentElement objects within the RichTextBox.
来自 richtextbox 文档的事件有点棘手。
对于某些事件,您可能还必须在 BlockUIContainer 中放置一个控件。
即便如此,有些事情也不会像您预期的那样有效。
点击已经具有意义,因此您可能会发现它已经在处理点击事件。使用预览事件 - PreviewMouseDown 和 PreviewMouseUp 之类的东西。
我正在尝试将事件添加到我每次在富文本框中创建的标签。这是下面的代码。 在我的 class MainWindowController 中我有:
public static Window MainWindow = new Windows.MainWindow();
public static Pages.MainPage MainPage = new Pages.MainPage();
public static Pages.LoginPage LoginPage = new Pages.LoginPage();
public static FlowDocument ChatDocument = new FlowDocument();
public static Paragraph ChatParagraph = new Paragraph();
在另一个 class 中,我有这个方法,每次客户端通过网络收到更新状态消息时我都会调用它。
private static void HandleStatus(string MessageString)
{
string Sender = AuxiliaryClientWorker.GetElement(MessageString, "-U ", " -Content");
string Message = AuxiliaryClientWorker.GetElement(MessageString, "-Content ", ".");
MainWindowController.MainWindow.Dispatcher.Invoke(() =>
{
#region Status updater
System.Windows.Controls.Label StatusLabel = new System.Windows.Controls.Label();
StatusLabel.FontSize = 18;
StatusLabel.FontStyle = FontStyles.Oblique;
StatusLabel.FontStyle = FontStyles.Italic;
StatusLabel.Foreground = System.Windows.Media.Brushes.Black;
StatusLabel.Content = Sender + " has updated their status to " + Message;
StatusLabel.MouseEnter += StatusLabel_MouseEnter;
#endregion
MainWindowController.ChatParagraph.Inlines.Add(StatusLabel);
MainWindowController.ChatParagraph.Inlines.Add(Environment.NewLine);
MainWindowController.ChatDocument.Blocks.Add(MainWindowController.ChatParagraph);
MainWindowController.MainPage.ClientChatTextBox.Document = MainWindowController.ChatDocument;
});
}
private static void StatusLabel_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
{
MessageBox.Show("This");
}
一切正常,唯一的问题是富文本框中的 UI 元素不“侦听”事件,此后事件永远不会触发。 MessageBox 从不显示。我尝试将 Dispatcher.Invoke 命令添加到下面的方法中,但它只是拒绝工作并且事件永远不会触发。我希望你们都明白我在做什么!
TLDR: StatusLabel_MouseEnter never fires
您需要在 RichTextBox 上将 IsDocumentEnabled
属性 设置为 true。
Gets or sets a value that indicates whether the user can interact with UIElement and ContentElement objects within the RichTextBox.
来自 richtextbox 文档的事件有点棘手。
对于某些事件,您可能还必须在 BlockUIContainer 中放置一个控件。
即便如此,有些事情也不会像您预期的那样有效。
点击已经具有意义,因此您可能会发现它已经在处理点击事件。使用预览事件 - PreviewMouseDown 和 PreviewMouseUp 之类的东西。