我有一个类似以下的TextBox:
<TextBox
Name="TxtBackupPath"
Grid.Column="0"
Grid.Row="0"
Height="Auto"
TextWrapping="Wrap"
Style="{Binding Path=BackupPathStyle}"
Foreground="{Binding Path=ForegroundColor}"
Text="{Binding Path=BackupPath, Mode=TwoWay}"
VerticalAlignment="Stretch"
AcceptsReturn="True"
Margin="3,3"
VerticalScrollBarVisibility="Disabled"
/>
在Code中我可以像下面这样设置ForegroundColor而不会出错:
Brush _Red = Brushes.Red;
backupDirectory.ForegroundColor = _Red;
backupDirectory是绑定到UI的dataSource。我试图使用MVVM作为模式通过代码中的属性设置UI元素。当我尝试使用类似的样式时:
Style style = new Style(typeof(TextBox));
style.Setters.Add(new Setter(Control.ForegroundProperty, Brushes.Goldenrod));
style.Setters.Add(new Setter(Control.BackgroundProperty, Brushes.Aqua));
backupDirectory.BackupPathStyle = style;
我得到“调用线程无法访问此对象,因为另一个线程拥有它。”错误。我不明白为什么Style和Foreground在从代码设置时会有不同的反应。
是否可以通过属性设置TextBox的样式?使用MVVM最简单的方法是什么?
答案 0 :(得分:0)
我得到“调用线程无法访问此对象,因为另一个线程拥有它。”错误。我不明白为什么Style和Foreground在从代码设置时会有不同的反应。
必须从(唯一的)UI线程设置此类属性 - 您的代码显然在后台线程上运行。您可以安排在UI线程上执行的代码,如下所示:
Dispatcher.Invoke(() => MyControl.Style = new Style());
那就是说,至少包括backupDirectory
的部分内容(特别是你设置的属性)会有所帮助。
答案 1 :(得分:0)
我要做一些猜测。
Brush _Red = Brushes.Red; backupDirectory.ForegroundColor = _Red;
不会实例化任何新对象; Brushes.Red
是一个静态属性,已由UI线程实例化,而您只是将该预先实例化对象的引用分配给ForegroundColor
属性。Style style = new Style(typeof(TextBox));
显然是在实例化Style
类的新实例。如果point 1
正确,则不会在UI线程上创建此对象。