我有一个简单的 WPF 应用程序,它在 ListView 中显示字符串集合。将鼠标悬停在一行上时,会出现带有文本的工具提示:
出现工具提示后,我使用鼠标滚轮垂直滚动 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 。


