使用调度程序从另一个类访问 UI 元素时,UI 元素为 null



我有一个类需要更新我的UI。目前,我正在调用UI类中保存的函数,并传递需要更新的内容。 例如

public class someclass
{
public someclass()
{
MainWindow main = new MainWindow();
main.DrawGrid(Brushes.Black);
}
}
public class MainWindow
{
...
public void DrawGrid(Brush colour)
{
ReturnGrid().background = colour;
}
}

但是这在线程方面存在问题,所以我更新了我的代码以使用调度程序。

public class someclass
{
public someclass()
{
MainWindow main = new MainWindow();
main.DrawGrid(string "black");
}
}
public class MainWindow
{
...
public void DrawGrid(Brush colour)
{
Dispatcher.Invoke(() => {ReturnGrid().Background = colour};);
}
public Grid ReturnGrid()
{
return maingrid; //defined in xaml
}
}

但是,这会引发返回的网格为 null 的错误。 但是,如果我从MainWindow调用DrawGrid,它将正常工作。

编辑:数据绑定方法

public class someclass
{
public someclass()
{
MainWindow.testbackground = Brushes.Black;
}
}
public class MainWindow
{
public static Brush testbackground = Brushes.White;
...
}
<MainWindow x:Name="mainwindow" ...>
...
<Grid ... Background="{Binding testbackground ElementName=mainwindow}"/>
</MainWindow>

此处的根本问题是由以下事实引起的:XAML 定义的控件是通过延迟方式(即异步(创建的。实例化 WPF 窗口后,必须等待触发Loaded事件。在此之前,所有视觉对象都是 null 值,DrawGrid()方法都会失败。

public class someclass
{
public someclass()
{
MainWindow main = new MainWindow();
main.Loaded += Window_Loaded;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
main.DrawGrid(Brushes.Black);
}   
}

当然,这只是一个示例。一旦不再需要事件处理程序,您就有责任解除绑定,检查触发的事件发生是否完全由您预期的流引起,等等。

尽管没有遵循 WPF 的 MVVM 标准良好编程实践,但我找到了一个简单的解决方案。

public class someclass
{
public somelcass()
{
MainWindow.gridbackground = Brushes.Black;
}
}
public class MainWindow
{
public static Brush gridbackground = Brushes.White;
public DispatchTimer timer;
public MainWindow()
{
timer.Tick += checkbackground;
timer.Start();
}
private void checkbackground(object sender, EventArgs e)
{
grid.Background = gridbackground;
}
}

创建一个静态变量和一个调度计时器来定期检查更改是有效的。

最新更新