从非UI线程中查找控件名称

时间:2011-04-18 02:06:06

标签: wpf c#-4.0

我找到了一个很好的Find Name代码片段,我正在WPF解决方案中使用:

public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
    {
        for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
            string controlName = child.GetValue(Control.NameProperty) as string;
            if (controlName == name)
            {
                return child as T;
            }
            else
            {
                T result = FindVisualChildByName<T>(child, name);
                if (result != null)
                    return result;
            }
        }
        return null;
    }

但这只有在我在UI线程上才有效。

我有另一个播放带有结束同步的音频文件的线程。我想使用上面的代码在ui线程上设置dep属性,但我一直遇到跨线程错误。

即使尝试简单:

SoundFXPad selectedSoundFXPad = (SoundFXPad)m_parent.FindName("panelC" + numbervar);

给我同样的错误

我见过的所有其他线程安全的WPF Dispatcher-Invoke代码假设您已经知道控件的名称。有没有办法以线程安全的方式使用上面的任何一个代码来影响另一个需要“找到”名称的线程的UI控件?

谢谢!

1 个答案:

答案 0 :(得分:1)

每个应用程序通常有一个UI线程(通常;您可以创建多个,但这并不常见)。所以你不需要控制名来找到调度程序 - 试试这个:

Application.Current.Dispatcher.Invoke(new Action(
    delegate {
         // Put code that needs to run on the UI thread here
    }));