2015-01-04 21 views
5

Windows Phone 8.1 uygulamasında, üç farklı renk durumuna sahip olması gereken birkaç bileşene sahip bir sayfam var. Ya kırmızı, mavi veya mevcut temanın ön plan rengi olmalıdır.Windows Phone 8.1'de tema değişikliklerini program aracılığıyla denetleme zamanı.

Bu nedenle, benim app telefondaki Koyu teması kullanılarak başlatıldıysa ve ardından kullanıcı uygulamadan çıkar ve Light temasını değiştirir ve uygulamamda tekrar başlarsa, derhal bileşenleri değiştirmem gerekir. eski temanın ön plan rengi.

Bileşenlerin farklı renkler arasında değişmesi beklendiği için (temanın ön plan rengi bunlardan yalnızca bir tanesidir) Ön Planlarını XAML'da PhoneForegroundColor olarak ayarlayamıyorum. Yaptığım Ne

bunu yapan bir Resuming olay dinleyicisi eklemektir:

myTextBlock.Foreground = new SolidColorBrush((Color)Application.Current.Resources["PhoneForegroundColor"]); 

Ama ... Resuming olay güncellenmektedir Application.Current kaynaklarının önce tetiklenir, bu yüzden sonunda Daha önce olduğu gibi aynı renkte. Kullanıcı bir kez daha tekrarlanırsa, Application.Current.Resources["PhoneForegroundColor"]'un bir önceki seferde Resuming olayından sonra güncellendiği için çalışır.

Soru: Ben ilk doğru yer görünmüyor Resuming beri güncellenen Application.Current.Resources["PhoneForegroundColor"] okuyabilir?

Soru: Alternatif, ben Telefon Tema değişiklikleri akla kalmadan Kırmızı/Mavi/Devral arasında programlama yoluyla myTextBlock.Foreground değiştirebilir, böylece başka bileşenin ForegroundColor (CSS-ish) devralmak için myTextBlock için bir yol var Uygulamamın yaşam döngüsü içinde

Herhangi bir öneri takdir edildi! İlk soruya gelince

cevap

2

: "Devam süreci" resmen belgelenmiş, ama şunları anladım değildir:

Devam UI iş parçacığı üzerinde çağrılır. Boş bir iade yöntemi olduğu için, arayan, içinde bir bekleyiş olduğu zaman devam edecektir. UI iş parçacığı içine bir şey bildirirseniz, bu görev dağıtıcı sırada olacak ve şimdiki görev (özgeçmiş) sonra çalıştırın.

Yani sadece (ve o inşaat ^^) bu yaptı: Sen app.xaml bir "ValueProvider" geçebileceğini için kaydeder: İkinci soruya gelince

private async void App_Resuming(object sender, object e) 
{ 

    var x1 = new SolidColorBrush((Color)Application.Current.Resources["PhoneForegroundColor"]); 
    Debug.WriteLine(x1?.Color.ToString()); 

    // Await marshalls back to the ui thread, 
    // so it gets put into the dispatcher queue 
    // and is run after the resuming has finished. 
    await Task.Delay(1); 

    var x2 = new SolidColorBrush((Color)Application.Current.Resources["PhoneForegroundColor"]); 
    Debug.WriteLine(x2?.Color.ToString()); 
} 

özgeçmiş olayı ve sadece mevcut renk ile bir bağımlılık özelliği sağlar.

Bunu, onu kullanmak istediğiniz herhangi bir TextBlock'ta, ancak en azından doğrudan XAML'de ayarlamanız gerekecektir. Bu da stiller için işe yarayabilir, ama bunu denemedim.

Numune uygulama ....

Sağlayıcı:

public class ColorBindingProvider : DependencyObject 
{ 
    public ColorBindingProvider() 
    { 
     App.Current.Resuming += App_Resuming; 
    } 

    private async void App_Resuming(object sender, object e) 
    { 
     // Delay 1ms (see answer to your first question) 
     await Task.Delay(1); 

     TextColor = new SolidColorBrush((Color)Application.Current.Resources["PhoneForegroundColor"]); 
    } 

    public Brush TextColor 
    { 
     get { return (Brush)GetValue(TextColorProperty); } 
     set { SetValue(TextColorProperty, value); } 
    } 

    public static readonly DependencyProperty TextColorProperty = 
     DependencyProperty.Register("TextColor", typeof(Brush), typeof(ColorBindingProvider), new PropertyMetadata(null)); 
} 

App.xaml:

<Application.Resources> 
    <local:ColorBindingProvider x:Name="ColorBindingProvider" TextColor="{StaticResource PhoneForegroundBrush}" /> 
</Application.Resources> 

MainPage.xaml:

<TextBlock Text="Hey ho let's go" Foreground="{Binding TextColor, Source={StaticResource ColorBindingProvider}}" /> 
+0

Çok teşekkürler! Ben de işe yarayan ilk bende var, bu yüzden bu çözümle gidiyorum :) Alternatif çözüm için, ön plana programlı olarak "{Binding TextColor, Source = {StaticResource ColorBindingProvider}}" şeklinde ayarlamalıyım. Kırmızı veya Mavi ile üzerine yazmış olabileceğime göre, XAML'deki her şey artık aktif değil ... – andrrs

+0

Hayır, Renk ayarınızı sağlayıcının "App_Resuming" yöntemine koyabilirsiniz. Bu bir bağımlılık özelliğidir, bu nedenle tüm bağlamaları güncellemeye bildirir. Çalışma zamanında renk ayarlarını değiştirirseniz, elbette bunu bir şekilde tetiklemeniz gerekir. Mesajlaşma kullanın ya da sadece App.Current.Resources [...] aracılığıyla sağlayıcınıza ulaşın ve özelliği ayarlayın. –

+0

Btw: Bir bağımlılık özelliği kullanmak yerine, yalnızca BindingProvider uygulamasının INotifyPropertyChanged ... –

1

Windows Phone 8.1 size numaralama Windows.UI.Xaml.ApplicationTheme değeri dönecektir Application.Current.RequestedTheme cadı üzerinden seçilen tema belirlemek edebiliyoruz.

örnek:

public static string GetImagePath(){ 
    // if the background color is black, i want a white image 
    if(Application.Current.RequestedTheme == ApplicationTheme.Dark) 
     return "ms-appx:///Assets/img_light.jpg"; 

    // if the background color is white, i want a dark image 
    return "ms-appx:///Assets/img_dark.jpg"; 
} 

yan not: https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.application.requestedtheme

0

App_Resuming için Kayıt bunun nedeni benim için işe yaramadı: Eğer Application.Current.RequestedTheme

daha ayrıntılı bilgi içeren seçilen temayı değiştirmek için bile edebiliyoruz Uygulama askıya alınmadığında etkinlik yükseltilmez. Bu çözümle Task.Delay'a gerek duymadım. Bu çözümle Task.Delay'a ihtiyacım yoktu.

İlgili konular