gpt4 book ai didi

c# - 不理解 wpf 更新动态创建的图像控件可见性每秒变化的行为

转载 作者:太空宇宙 更新时间:2023-11-03 20:50:31 27 4
gpt4 key购买 nike

我在 wpf 中有一个 8 行 8 列的网格:

<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Test"
mc:Ignorable="d"
Loaded="Window_Loaded"
Title="MainWindow" Height="560" Width="800">
<Grid x:Name="MyGrid" ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
<ColumnDefinition></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
</Grid>
</Window>

后面的代码是:

public partial class MainWindow : Window
{
private const int MaxRow = 8;
private const int MaxCol = 8;

public MainWindow()
{
InitializeComponent();
DataContext = this;
}

private void Start()
{
for (int i = 0; i < MaxRow ; i++)
{
for (int j = 0; j < MaxCol ; j++)
{
string current = $"ImgR{i}C{j}";
object currentImg = this.FindName(current);

if (currentImg?.GetType() == typeof(Image))
{

var img = ((Image)currentImg);

Thread.Sleep(1500);
img.Visibility = Visibility.Visible;
DoEvents();

Thread.Sleep(1500);
img.Visibility = Visibility.Hidden;
DoEvents();
}
}
}
}



private void Window_Loaded(object sender, RoutedEventArgs e)
{

var pngImage = new BitmapImage(new Uri(@"C:\Test\cross.png", UriKind.Absolute));
for (int i = 0; i < MaxRow ; i++)
{
for (int j = 0; j < MaxCol; j++)
{
var img = new Image
{
Source = pngImage,
Name = $"ImgR{i}C{j}",
Visibility = Visibility.Hidden
};

Grid.SetRow(img, i);
Grid.SetColumn(img, j);
MyGrid.Children.Add(img);
RegisterName($"ImgR{i}C{j}", img);
}
}
Start();
}


public static void DoEvents()
{
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,
new Action(delegate { }));
}
}

enter image description here

所以我的想法是动态创建 8x8 图像,并注册它们。然后在两个循环中我改变它的可见性。所以最终的效果是图像交叉穿过 8x8 网格程序似乎正确地执行了它,但是过渡并不平滑有时,我的意思是,十字会改变它的可见性但偶尔(程序通常运行良好)不显示。

我猜问题出在我更新 Ui 时使用:

public static void DoEvents()
{
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,
new Action(delegate { }));
}

有没有更好的方法来做到这一点,或者交叉有时不显示可能是什么问题。

最佳答案

我试过代码,对我来说我什至看不到十字,事实上窗口挂了。这就是我所期待的。

您正在调用 UI 线程中的 Start 方法并通过它运行一个循环或放置一个 Thread.Sleep。这两个操作都是阻塞的,即它们将使用 UI 线程中的资源并且窗口将挂起。

要解决这个问题,您应该在后台方法/任务中启动该方法。以下应该工作。不要直接调用 Start 试试这个:

Task.Run(() => Start());

此外,我不理解您的 Do Events 方法,而且由于现在您的整个 Start 方法都在后台,您必须确保处理跨线程操作。您还必须添加适当的异常处理。

    private void Start()
{
for (int i = 0; i < MaxRow; i++)
{
for (int j = 0; j < MaxCol; j++)
{
string current = $"ImgR{i}C{j}";
object currentImg = Application.Current.Dispatcher.Invoke(() => this.FindName(current));

if (currentImg?.GetType() == typeof(Image))
{

var img = ((Image) currentImg);

Thread.Sleep(100);
Application.Current.Dispatcher.Invoke(() => img.Visibility = Visibility.Visible);

//DoEvents();

//Thread.Sleep(100);
//Application.Current.Dispatcher.Invoke(() => img.Visibility = Visibility.Visible);
//DoEvents();
}
}
}
}

关于c# - 不理解 wpf 更新动态创建的图像控件可见性每秒变化的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55840429/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com