Skip to main content
 首页 » 编程设计

c#中评估元素 'System.Windows.Controls.TextBlock' 上的 ThemeStyle 属性时发现循环引用

2025年12月25日3398°冷暖

我有一个简单的 WPF 应用程序,它在 ListView 中显示字符串集合。将鼠标悬停在一行上时,会出现带有文本的工具提示:

enter image description here

出现工具提示后,我使用鼠标滚轮垂直滚动 System.InvalidOperationException 并抛出此消息

Cyclic reference found while evaluating the ThemeStyle property on element 'System.Windows.Controls.TextBlock'

XAML 包含一个带有样式的 ListView,它为每一行显示一个工具提示:

<Window x:Class="CylicDependencyWpfApplication.MainWindow" 
...> 
    <ListView ItemsSource="{Binding}"> 
        <ListView.Resources> 
            <Style TargetType="{x:Type TextBlock}"> 
                <Setter Property="ToolTip"> 
                    <Setter.Value> 
                        <TextBlock>tooltip</TextBlock> 
                    </Setter.Value> 
                </Setter> 
            </Style> 
        </ListView.Resources> 
        <ListView.View> 
            <GridView> 
                <GridViewColumn Width="300" Header="Column1" DisplayMemberBinding="{Binding}"/> 
            </GridView> 
        </ListView.View> 
    </ListView> 
</Window> 

显示的数据来自ObservableCollection,它在MainWindow的构造函数中设置

public MainWindow() 
{ 
        InitializeComponent(); 
        this.DataContext = observableCollection; 
        for (int i = 0; i < 30; i++) 
        { 
            observableCollection.Add($"item{i}"); 
        } 
} 

为了更好地查看异常的内容,我添加了一个DispatcherUnhandledException-handler:

private void App_OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
{ 
        Exception ex = e.Exception; 
        // System.InvalidOperationException 
        string name = ex.GetType().FullName; 
        // Cyclic reference found while evaluating the ThemeStyle property on element 'System.Windows.Controls.TextBlock'. 
        string message = ex.Message; 
} 

问题的原因是什么?请帮助我!

请您参考如下方法:

出现这个问题是因为该样式不仅应用于ListView的TextBlock,还应用于ToolTip中的TextBlock!这会将工具提示添加到工具提示中包含的文本 block 。因此就会发生这样的循环。

可以这样修复:

    <ListView.Resources> 
        <Style TargetType="{x:Type TextBlock}"> 
            <Setter Property="ToolTip"> 
                <Setter.Value> 
                    <TextBlock ToolTip="">tooltip</TextBlock> 
                </Setter.Value> 
            </Setter> 
        </Style> 
    </ListView.Resources> 

这样,样式就不再将工具提示应用于工具提示中包含的文本 block 。