代码之家  ›  专栏  ›  技术社区  ›  Aedvald Tseh

计算元素“System.Windows.Controls.TextBlock”的ThemeStyle属性时发现循环引用

  •  0
  • Aedvald Tseh  · 技术社区  · 6 年前

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

    enter image description here

    工具提示出现后,我使用鼠标滚轮垂直滚动 与此消息一起抛出

    计算元素“System.Windows.Controls.TextBlock”的ThemeStyle属性时发现循环引用

    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>
    

    可观测集合

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

    为了更好地看到异常的内容,我添加了一个 -经办人:

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Aedvald Tseh    6 年前

    出现此问题,因为样式列表不仅应用于ListView的TextBlock,还应用于工具提示中的TextBlock!!这将向工具提示中包含的textblock添加工具提示。因此,这个循环就发生了。

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

    这样样式就不再将工具提示应用于工具提示中包含的textblock。