InlineUIContainer删除RichTextBox中的事件

时间:2015-02-26 13:54:43

标签: c# wpf richtextbox inlineuicontainer

有没有办法在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);
            }
        });
}

2 个答案:

答案 0 :(得分:1)

您可以在TabControl.SelectionChanged被解雇时取消订阅卸载事件。并在选择特定选项卡时再次订阅。

但我认为更好的方法是创建一个自定义控件,它将托管TextBox和ItemsControl,并且不使用RichTextBox。

答案 1 :(得分:0)

解决方案,看看是否加载了父级:

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