я знаю, что таких вопросов много. Я хотел опубликовать, чтобы я мог поделиться своим конкретным вопросом, потому что я расстроен.
я запускаю поток, который запрашивает путь из базы данных и помещает его в элемент image.problem: я создал изображение в xaml, поэтому при запуске этого потока он выдает ошибку доступа к этому объекту, которая не может получить доступ к элементу изображения .
тогда как мне установить его без использования xaml ?? вот мой фрагмент кода:
public partial class Window1 : Window
{
Thread Frame1;
public Window1()
{
InitializeComponent();
intializeDb();
#region start frame 1 thread
Frame1 = new Thread(frame1);
Frame1.SetApartmentState(ApartmentState.STA);
Frame1.IsBackground = true;
Frame1.Start();
#endregion
}
public void frame1()
{
string k;
command.CommandText = "SELECT * FROM imageframe1";
sqlConn.Open();
Reader = command.ExecuteReader();
while (Reader.Read())
{
BitmapImage logo = new BitmapImage();
logo.BeginInit();
k = (string)(Reader.GetValue(1));
logo.UriSource = new Uri(k);
logo.EndInit();
image1.Source = logo; //THROWS THE ERROR HERE.IT CANT ACCESS image1
Thread.Sleep(1000);
}
sqlConn.Close();
Reader.Close();
}
как бы мне получить доступ к image1
тогда? если я создаю новый в потоке, мне нужно будет поместить его как дочерний элемент панели, и тогда я получу ошибку, которая не сможет получить доступ к панели.
Как-нибудь обойтись? Рад, что кто-то может написать пример, основанный на моем фрагменте.
отредактировано безуспешно и выдает ту же ошибку:
public partial class Window1 : Window
{
public readonly SynchronizationContext mySynchronizationContext;
public Window1()
{
InitializeComponent();
mySynchronizationContext = SynchronizationContext.Current;
Frame1 = new Thread(frame1);
Frame1.SetApartmentState(ApartmentState.STA);
Frame1.IsBackground = true;
Frame1.Start();
}
public void frame1()
{
string k;
command.CommandText = "SELECT * FROM imageframe1";
sqlConn.Open();
Reader = command.ExecuteReader();
while (Reader.Read())
{
BitmapImage logo = new BitmapImage();
logo.BeginInit();
k = (string)(Reader.GetValue(1));
logo.UriSource = new Uri(k);
logo.EndInit();
SendOrPostCallback callback = _ =>
{
image1.Source = logo;
};
mySynchronizationContext.Send(callback, null);
//image1.Source = logo;
Thread.Sleep(1000);
}
sqlConn.Close();
Reader.Close();
}
}