RichTextBox 中的 InlineUIContainer 删除事件
InlineUIContainer delete event in RichTextBox
有没有办法在 InlineUIContainer
在 RichTextBox
中被删除时得到通知?目前我正在使用 Unload
事件,这是一个问题,因为当我在选项卡之间切换时也会调用该事件。
我的代码:
正在创建 InlineUIContainer
:
InlineUIContainer container = new InlineUIContainer(presenter) { BaselineAlignment = BaselineAlignment.TextBottom };
container.Tag = new TagTextBoxObject(Id, InputText);
container.Unloaded += presenter_Unloaded;
不应在切换标签时触发的事件:
void presenter_Unloaded(object sender, RoutedEventArgs e)
{
Dispatcher.Invoke(
(Action)delegate()
{
TagTextBoxObject item = (TagTextBoxObject)(sender as InlineUIContainer).Tag;
if (newItems.ContainsKey(item.Id))
{
newItems.Remove(item.Id);
}
if (!deletedItems.ContainsKey(item.Id))
{
deletedItems.Add(item.Id, item.Text);
}
});
}
您可以在触发 TabControl.SelectionChanged
时取消订阅 Unload 事件。并在选择特定选项卡时再次订阅。
但我认为更好的方法是创建一个自定义控件,它将承载一个 TextBox 和一个 ItemsControl,并且不使用 RichTextBox。
解决方法,看是否加载了parent:
void presenter_Unloaded(object sender, RoutedEventArgs e)
{
if (this.Parent != null && this.Parent is FrameworkElement)
{
if ((this.VisualParent as FrameworkElement).IsLoaded)
{
Dispatcher.Invoke(
(Action)delegate()
{
TagTextBoxObject item = (TagTextBoxObject)(sender as InlineUIContainer).Tag;
if (newItems.ContainsKey(item.Id))
{
newItems.Remove(item.Id);
}
if (!deletedItems.ContainsKey(item.Id))
{
deletedItems.Add(item.Id, item.Text);
}
});
}
}
}
有没有办法在 InlineUIContainer
在 RichTextBox
中被删除时得到通知?目前我正在使用 Unload
事件,这是一个问题,因为当我在选项卡之间切换时也会调用该事件。
我的代码:
正在创建 InlineUIContainer
:
InlineUIContainer container = new InlineUIContainer(presenter) { BaselineAlignment = BaselineAlignment.TextBottom };
container.Tag = new TagTextBoxObject(Id, InputText);
container.Unloaded += presenter_Unloaded;
不应在切换标签时触发的事件:
void presenter_Unloaded(object sender, RoutedEventArgs e)
{
Dispatcher.Invoke(
(Action)delegate()
{
TagTextBoxObject item = (TagTextBoxObject)(sender as InlineUIContainer).Tag;
if (newItems.ContainsKey(item.Id))
{
newItems.Remove(item.Id);
}
if (!deletedItems.ContainsKey(item.Id))
{
deletedItems.Add(item.Id, item.Text);
}
});
}
您可以在触发 TabControl.SelectionChanged
时取消订阅 Unload 事件。并在选择特定选项卡时再次订阅。
但我认为更好的方法是创建一个自定义控件,它将承载一个 TextBox 和一个 ItemsControl,并且不使用 RichTextBox。
解决方法,看是否加载了parent:
void presenter_Unloaded(object sender, RoutedEventArgs e)
{
if (this.Parent != null && this.Parent is FrameworkElement)
{
if ((this.VisualParent as FrameworkElement).IsLoaded)
{
Dispatcher.Invoke(
(Action)delegate()
{
TagTextBoxObject item = (TagTextBoxObject)(sender as InlineUIContainer).Tag;
if (newItems.ContainsKey(item.Id))
{
newItems.Remove(item.Id);
}
if (!deletedItems.ContainsKey(item.Id))
{
deletedItems.Add(item.Id, item.Text);
}
});
}
}
}