WPF自定义字典仅在Windows 10的%TEMP%目录中创建.dic文件

4
我遇到了一个问题,当我向文本框/富文本框添加自定义字典时,'.dic'文件会被创建在%TEMP%目录下并且不会被删除。这在Windows 7上运行良好,但现在在Win 10上出现了上述问题。这些文件始终为零字节,并以类似于1s3iqqvw.dic的名称命名。
真正的应用程序有很多文本/富文本框,每次实例化其中一个时,在添加自定义字典时都会创建一个新的dic文件,用户不久就会在他们的temp目录中拥有数百个这样的文件。
更糟糕的是,随着越来越多的.dic文件被创建,该过程会变得越来越慢 - Windows似乎会生成一个随机的文件名,然后在创建它之前搜索目录中是否有重复的文件名,如果找到重复的文件名则一直重复此过程,直到找到唯一的文件名。当有数百个.dic文件时,这会严重降低应用程序的速度 - 我们需要手动删除.dic文件才能解决问题。
下面的代码将重新创建此问题。在Win 10上,.dic文件会被创建在%TEMP%目录下 - 而在Win 7上则不是这种情况。
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            //dict.txt must exist
            this.textBox1.SpellCheck.CustomDictionaries.Add(new Uri("d:\\dict.txt", UriKind.Relative));
            textBox1.Text = "Lorem ipsum dolor sit amet";
        }
    }
}


<Window x:Class="testapp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:u="clr-namespace:testapp"
        Title="MainWindow" Height="350" Width="799"
        >
    <Grid>
        <TextBox SpellCheck.IsEnabled="True" Height="287" Margin="6,12,0,0" Name="textBox1" VerticalAlignment="Top" HorizontalAlignment="Left" Width="759" TextWrapping="Wrap" AcceptsReturn="True"/>
    </Grid>
</Window>

有没有人注意到Windows 10上的这个问题?你有解决方法吗?

1个回答

0

我知道这不是问题的真正解决方法,但目前看起来至少有所帮助。我找不到避免创建.dic文件的方法。然而,通过查看代码,我发现清除CustomDictionaries将触发删除.dic文件。

我目前的想法是在窗口关闭时清除它们。您可以手动清除每个字典,或者类似下面的循环遍历它们。(感谢Find all controls in WPF Window by type的帖子)

    public MainWindow()
    {
        InitializeComponent();

        this.textBox1.SpellCheck.CustomDictionaries.Add(new Uri("C:\\dict.txt", UriKind.Relative));
        textBox1.Text = "Lorem ipsum dolor sit amet";

        this.Closed += ((object sender, EventArgs e) => {
            foreach (var txtbox in FindVisualChildren<TextBox>(this))
            {
                txtbox?.SpellCheck?.CustomDictionaries?.Clear();
            }
        });
    }

    public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
    {
        if (depObj != null)
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
            {
                DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                if (child != null && child is T)
                {
                    yield return (T)child;
                }

                foreach (T childOfChild in FindVisualChildren<T>(child))
                {
                    yield return childOfChild;
                }
            }
        }
    }

如果您感兴趣的话,我认为导致问题的源代码在这里可用: (https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/windows/Documents/WinRTSpellerInterop.cs,2777e92ca38df44a,references)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接