locked
Смена свойства IsEnabled у ApplicationBarIconButton в BackgroundWorker RRS feed

  • Вопрос

  • Доброго времени суток! Столкнулся с проблемой: невозможно сменить свойство IsEnabled у ApplicationBarIconButton в BackgroundWorker, сразу же NullReferenceException. Как это реализовать в потоке BackgrounWorker`а?
    23 декабря 2012 г. 14:26

Ответы

  • Привет.

    Событие RunWorkerCompleted вызывается в UI потоке и вам не нужен Dispatcher для обращения или изменения свойст элементов управления.

    Проверьте в этом событие размер массива ApplicationBar.Buttons, этот массив как раз содержит кнопки, которые вам нужны. Доступ по именам кнопок, заданных в xaml, к сожалению работает не так для AppBar, как для других элементов. И вам нужно к кнопкам обращаться либо через массив Buttons у this.ApplicationBar:

    Microsoft.Phone.Shell.ApplicationBarIconButton btn = ApplicationBar.Buttons[0] as Microsoft.Phone.Shell.ApplicationBarIconButton; btn.IsEnabled = false;

    Либо создавать AppBar в коде:

    private ApplicationBarIconButton SaveEdit;
    private void InitAppBar()
    {
         ApplicationBar appBar = new ApplicationBar();
    
         SaveEdit = new ApplicationBarIconButton(new Uri("images/appbar.check.rest.png", UriKind.Relative));
         SaveEdit.Click += new EventHandler(OnClick_Check);
         SaveEdit.Text = Strings.Save_button;
         appBar.Buttons.Add(SaveEdit);
    
         ApplicationBarIconButton CancelEdit = new ApplicationBarIconButton(new Uri("images/appbar.close.rest.png", UriKind.Relative));
         CancelEdit.Click += new EventHandler(OnClick_Cancel);
         CancelEdit.Text = Strings.Cancel_button;
         appBar.Buttons.Add(CancelEdit);
    
         ApplicationBar = appBar;
    }

    Вот темы об этом: ApplicationBar is always NULL и ApplicationBarIconButton is null

    Скорей всего у вас эта проблема.


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 11 января 2013 г. 11:35
    9 января 2013 г. 12:06

Все ответы

  • Добрый день.

    Покажите, пожалуйста, код. Т.к. у меня есть ощущение, что у вас не на элементе, а на чем то другом падает Exception.

    24 декабря 2012 г. 7:00
    Отвечающий
  • Привет. Пожалуйста, не бросайте топик без ответа или комментариев. Спасибо.


    Для связи [mail]

    25 декабря 2012 г. 11:42
  • Извините за игнор:(

    public partial class MainPage : PhoneApplicationPage
    	{
    		BackgroundWorker bw;
    		Advice desearized;
    		IsolatedStorageSettings appSettings;
    
    		/// <summary>
    		/// Конструктор
    		/// </summary>
    		public MainPage()
    		{
    			InitializeComponent();
    			appSettings = IsolatedStorageSettings.ApplicationSettings;
    		}
    
    		void RunBackgroundDownload()
    		{
    			bw = new BackgroundWorker();
    			bw.WorkerReportsProgress = true;
    			bw.WorkerSupportsCancellation = true;
    			bw.RunWorkerCompleted += bw_RunWorkerCompleted;
    			bw.DoWork += bw_DoWork;
    			bw.RunWorkerAsync();
    		}
    
    		protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    		{
    			//Storyboard a = new Storyboard();
    			//a = MainPageIn;
    			//a.Begin();
    			RunBackgroundDownload();
    		}
    
    		protected override void OnNavigatingFrom(System.Windows.Navigation.NavigatingCancelEventArgs e)
    		{
    			//Storyboard a = new Storyboard();
    			//a = MainPageOut;
    			//a.Begin();
    		}
    
    
    		void bw_DoWork(object sender, DoWorkEventArgs e)
    		{
    			StringDownload();
    		}
    
    		void StringDownload()
    		{
    			rect.Dispatcher.BeginInvoke(() =>
    			{
    				//rect.Visibility = System.Windows.Visibility.Visible;
    				Dark.Begin();
    				//progressOverlay.Show();
    				spb.Visibility = System.Windows.Visibility.Visible;
    			});
    			WebClient web = new WebClient();
    			web.DownloadStringCompleted += web_DownloadStringCompleted;
    			Uri uri = GetCensorValue() == true ? new Uri(GetListPickerValue().Url + "censored/" + DateTime.Now.Ticks + "/", UriKind.Absolute) : new Uri(GetListPickerValue().Url + DateTime.Now.Ticks + "/", UriKind.Absolute);
    			web.DownloadStringAsync(uri);
    		}
    
    		void web_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    		{
    			try
    			{
    				if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
    				{
    					rect.Dispatcher.BeginInvoke(() =>
    					{
    						rect.Visibility = System.Windows.Visibility.Collapsed;
    					});
    					throw new WebException();
    				}
    				bool flag = false;
    				do
    				{
    					desearized = JsonConvert.DeserializeObject<Advice>(e.Result);
    					//me.Dispatcher.BeginInvoke(() =>
    					//{
    						//me.Loaded += me_Loaded;
    					//});
    					//me.Dispatcher.BeginInvoke(() => me.Source = new Uri("http://fucking-great-advice.ru/files/sounds/" + desearized.Sound));
    
    					desearized.Text = desearized.Text.Replace("&nbsp;", " ");
    					desearized.Text = desearized.Text.Replace("&#151;", " " + "\u2014" + " ");
    					if (desearized.Text.Contains("href") || desearized.Text.Contains("span") || desearized.Text == "")
    					{
    						StringDownload();
    						flag = false;
    					}
    					else
    					{
    						DashTextBlock.Dispatcher.BeginInvoke(() => DashTextBlock.Text = "—");
    						DataTextBlock.Dispatcher.BeginInvoke(() => DataTextBlock.Text = desearized.Text);
    						flag = false;
    					}
    				} while (flag);
    				rect.Dispatcher.BeginInvoke(() =>
    				{
    					Light.Begin();
    					//rect.Visibility = System.Windows.Visibility.Collapsed;
    					//progressOverlay.Hide();
    					spb.Visibility = System.Windows.Visibility.Collapsed;
    				});
    			}
    			catch (WebException)
    			{
    				string error = GetCensorValue() == false ? "У тебя нет Интернета, ёпта! Проверь подключения!" : "У Вас отсутствует доступ к Интернету. Проверьте сеть или Wi-Fi.";
    				DashTextBlock.Dispatcher.BeginInvoke(() => DashTextBlock.Text = "—");
    				DataTextBlock.Dispatcher.BeginInvoke(() => DataTextBlock.Text = error);
    				spb.Dispatcher.BeginInvoke(() => spb.Visibility = System.Windows.Visibility.Collapsed);
    			}
    
    
    		}
    
    		void me_Loaded(object sender, RoutedEventArgs e)
    		{
    			//me.Dispatcher.BeginInvoke(() => me.Play());
    			//me.Dispatcher.BeginInvoke(() => refreshButton.IsEnabled = false);
    			//Dispatcher.BeginInvoke(() => refreshButton.IsEnabled = false);
    		}
    
    
    		void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    		{
    
    		}
    
    		private void ApplicationBarMenuItem_Click_1(object sender, EventArgs e)
    		{
    			NavigationService.Navigate(new Uri("/Settings.xaml", UriKind.Relative));
    		}
    
    		private AdviceChapter GetListPickerValue()
    		{
    			if (appSettings.Contains("ListPickerValue"))
    			{
    				object o = appSettings["ListPickerValue"];
    				return (AdviceChapter)appSettings["ListPickerValue"];
    			}
    			else
    			{
    				appSettings.Add("ListPickerValue", Data.l[0]);
    				return Data.l[0];
    			}
    		}
    
    		private bool? GetCensorValue()
    		{
    			if (appSettings.Contains("Censor"))
    			{
    				return Convert.ToBoolean(appSettings["Censor"]);
    			}
    			else
    			{
    				appSettings.Add("Censor", true);
    				return true;
    			}
    		}
    
    		private void Refresh(object sender, EventArgs e)
    		{
    			RunBackgroundDownload();
    		}
    
    		private void ApplicationBarMenuItem_Click_2(object sender, EventArgs e)
    		{
    			AboutPrompt about = new AboutPrompt();
    			about.Title = "Great Advice";
    			about.VersionNumber = "Version 1.0";
    			about.Body = new TextBlock { Text = "Отличное приложение на каждый день! Воспользуйтесь нашими советами, и жизнь станет заметно лучше!", TextWrapping = TextWrapping.Wrap, FontSize = 60 };
    			AboutPersonItem author = new AboutPersonItem() { FontSize = 22 };
    			author.AuthorName = "Vadim Velikoivanenko";
    			author.EmailAddress = @"welikoiwanenko@live.com";
    			author.Role = "Author:";
    			author.WebSiteUrl = @"";
    			AboutPersonItem source = new AboutPersonItem() { FontSize = 22 };
    			source.WebSiteUrl = @"http://fucking-great-advice.ru/";
    			source.Role = "Source:";
    
    			about.Show(author, source);
    		}
    
    
    	}

    Если в web_DowloadStringCompleted, допустим, изменять Visibility аппбара, то вылезет исключение. В аппбаре, как и в Buttons на нем, нет Daspatcher`а, может из-за этого? Тогда как мнеять еговидимость в потоке BackgroundWorker?

    4 января 2013 г. 21:32
  • Привет.

    Событие RunWorkerCompleted вызывается в UI потоке и вам не нужен Dispatcher для обращения или изменения свойст элементов управления.

    Проверьте в этом событие размер массива ApplicationBar.Buttons, этот массив как раз содержит кнопки, которые вам нужны. Доступ по именам кнопок, заданных в xaml, к сожалению работает не так для AppBar, как для других элементов. И вам нужно к кнопкам обращаться либо через массив Buttons у this.ApplicationBar:

    Microsoft.Phone.Shell.ApplicationBarIconButton btn = ApplicationBar.Buttons[0] as Microsoft.Phone.Shell.ApplicationBarIconButton; btn.IsEnabled = false;

    Либо создавать AppBar в коде:

    private ApplicationBarIconButton SaveEdit;
    private void InitAppBar()
    {
         ApplicationBar appBar = new ApplicationBar();
    
         SaveEdit = new ApplicationBarIconButton(new Uri("images/appbar.check.rest.png", UriKind.Relative));
         SaveEdit.Click += new EventHandler(OnClick_Check);
         SaveEdit.Text = Strings.Save_button;
         appBar.Buttons.Add(SaveEdit);
    
         ApplicationBarIconButton CancelEdit = new ApplicationBarIconButton(new Uri("images/appbar.close.rest.png", UriKind.Relative));
         CancelEdit.Click += new EventHandler(OnClick_Cancel);
         CancelEdit.Text = Strings.Cancel_button;
         appBar.Buttons.Add(CancelEdit);
    
         ApplicationBar = appBar;
    }

    Вот темы об этом: ApplicationBar is always NULL и ApplicationBarIconButton is null

    Скорей всего у вас эта проблема.


    Для связи [mail]

    • Помечено в качестве ответа Abolmasov Dmitry 11 января 2013 г. 11:35
    9 января 2013 г. 12:06