RichTextBox中的Border.IsMouseOver(RichTextBox中的InlineUIContainer不响应事件/触发器)

时间:2013-08-07 19:16:38

标签: c# .net wpf wpf-controls richtextbox

说我有以下内容:

<Grid>

    <Grid.Resources>

        <Style TargetType="{x:Type Border}">
            <Style.Triggers>
                <Trigger Property="Border.IsMouseOver" Value="true">
                    <Setter Property="Background" Value="Black" />
                    <Setter Property="BorderBrush" Value="Red" />
                    <Setter Property="BorderThickness" Value="2" />
                    <Setter Property="CornerRadius" Value="7,2,10,2" />
                </Trigger>
                <Trigger Property="Border.IsMouseOver" Value="false">
                    <Setter Property="Background" Value="Black" />
                    <Setter Property="BorderBrush" Value="RoyalBlue" />
                    <Setter Property="BorderThickness" Value="2" />
                    <Setter Property="CornerRadius" Value="7,2,10,2" />
                </Trigger>
            </Style.Triggers>

        </Style>

        <Style TargetType="{x:Type TextBlock}">
            <Setter Property="Margin" Value="7,0,7,1" />
            <Setter Property="FontSize" Value="12" />
            <Setter Property="Foreground" Value="White" />
        </Style>

        <Style TargetType="{x:Type Run}">
            <Setter Property="FontSize" Value="12" />
        </Style>

    </Grid.Resources>

        <FlowDocument >

            <Paragraph>

                <Span>

                    <Border>

                        <TextBlock>Test</TextBlock>

                    </Border>

                </Span>

            </Paragraph>

        </FlowDocument>

    </RichTextBox>

</Grid>

当Border位于RichTextBox之外时,样式触发器可以很好地工作,但是当它们位于RichTextBox中的InlineUIContainer中时,它不会工作。

通过使用MouseOver事件和使用VisualTreeHelper.HitTest()方法设置后面代码中的属性,我能够获得所需的行为,但我很确定这是非常低效的,不能帮助,但认为有更好的方法来解决这个问题?

如果有人可以在这里提供一些指导,那将非常感激。

1 个答案:

答案 0 :(得分:1)

我必须搜索互联网最深和最黑暗的角落才能找到这个角落,但看起来有一个黑客可以在FlowDocument中为InlineUIElements启用事件:

public class EventEnabledFlowDocument : FlowDocument
{
    protected override bool IsEnabledCore
    {
        get
        {
            return true;
        }
    }
}

请注意,执行此操作可能会产生一些令人讨厌的副作用,但它似乎适用于我的目的。我知道的一个副作用 - 如果删除InlineUIElement然后撤消该删除,则不会保存事件处理程序。