2015-01-04 16 views
5

Tôi có một trang trong ứng dụng Windows Phone 8.1 nơi tôi có một vài thành phần có thể có ba trạng thái màu khác nhau. Chúng phải có màu đỏ, xanh dương hoặc màu nền trước của chủ đề hiện tại. Do đó, nếu ứng dụng của tôi bắt đầu sử dụng chủ đề Tối trên điện thoại, sau đó người dùng bước ra khỏi ứng dụng và thay đổi chủ đề Ánh sáng, sau đó lại vào lại ứng dụng, tôi cần thay đổi ngay các thành phần đã có màu nền trước của chủ đề cũ.Khi nào lập trình kiểm tra các thay đổi chủ đề trong Windows Phone 8.1

Vì các thành phần được cho là thay đổi giữa các màu khác nhau (trong đó màu nền trước của chủ đề chỉ là một trong số chúng), tôi không thể đặt Foreground thành PhoneForegroundColor trong XAML.

Những gì tôi đã làm là thêm một người biết lắng nghe Resuming trường hợp thực hiện điều này:

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

... Nhưng sự kiện Resuming là bắn trước khi các nguồn lực của Application.Current được cập nhật, vì vậy tôi kết thúc với cùng màu như trước. Nếu người dùng bước ra một lần nữa và trong một lần nữa, nó sẽ làm việc kể từ Application.Current.Resources["PhoneForegroundColor"] đã được cập nhật tại một số điểm sau khi sự kiện Resuming thời gian trước đó.

Câu hỏi: Khi nào lần đầu tiên tôi có thể đọc cập nhật Application.Current.Resources["PhoneForegroundColor"], vì Resuming dường như không đúng nơi?

Câu hỏi: Ngoài ra, có một cách để myTextBlock kế thừa ForegroundColor (CSS-ish) của thành phần khác, vì vậy mà tôi có thể thay đổi myTextBlock.Foreground programatically giữa Red/Blue/Kế thừa mà không cần phải bận tâm thay đổi đối với Theme điện thoại trong vòng đời của ứng dụng của tôi?

Bất kỳ đề xuất nào được đánh giá cao!

Trả lời

2

Về câu hỏi đầu tiên của bạn: Các "quá trình Tiếp tục" không chính thức ghi nhận, nhưng tôi đã tìm ra những điều sau đây:

Tiếp tục được gọi trên thread UI. Vì nó là một phương thức trả về khoảng trống, người gọi sẽ chỉ tiếp tục, khi nó đang chờ đợi bên trong. Nếu bạn marshall một cái gì đó vào chủ đề giao diện người dùng, nó sẽ được trong hàng đợi điều phối và có cho chạy sau khi nhiệm vụ hiện tại (tiếp tục).

Vì vậy, tôi chỉ cần thực hiện này (và nó hoạt động ^^):

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()); 
} 

Về câu hỏi của bạn thứ hai: Bạn có thể giới thiệu một "ValueProvider" trong App.xaml của bạn, mà đăng ký cho sự kiện tiếp tục và chỉ cung cấp thuộc tính phụ thuộc với màu hiện tại.

Bạn sẽ vẫn phải đặt điều đó trên bất kỳ TextBlock nào bạn muốn sử dụng trong đó, nhưng ít nhất là trực tiếp trong XAML. Điều này có thể làm việc cho phong cách quá, nhưng không thử điều đó.

Triển khai mẫu ....

Provider:

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

Cảm ơn rất nhiều! Tôi cũng đã nhận được một trong những đầu tiên để làm việc vì vậy tôi sẽ với giải pháp đó :) Đối với các giải pháp thay thế mặc dù, tôi sẽ cần phải lập trình thiết lập Foreground để "{Binding TextColor, Source = {StaticResource ColorBindingProvider}}" phải không? Vì tôi có thể đã ghi đè nó bằng màu đỏ hoặc màu xanh, vì vậy bất cứ điều gì trong XAML không hoạt động nữa ... – andrrs

+0

Không, bạn chỉ có thể đặt thiết lập Màu của bạn trong phương thức "App_Resuming" của nhà cung cấp. Nó là thuộc tính phụ thuộc, vì vậy nó sẽ thông báo cho tất cả các ràng buộc khi cập nhật. Tất nhiên bạn phải kích hoạt nó bằng cách nào đó, nếu bạn thay đổi cài đặt màu trên thời gian chạy. Sử dụng tin nhắn hoặc chỉ nhận nhà cung cấp qua App.Current.Resources [...] và đặt thuộc tính. –

+0

Btw: Thay vì sử dụng thuộc tính phụ thuộc, bạn cũng có thể chỉ có BindingProvider triển khai INotifyPropertyChanged ... –

1

Trong Windows Phone 8.1 bạn có thể xác định chủ đề được lựa chọn thông qua Application.Current.RequestedTheme phù thủy sẽ trả về một giá trị của enum Windows.UI.Xaml.ApplicationTheme.

dụ:

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"; 
} 

mặt lưu ý: bạn thậm chí có thể thay đổi chủ đề được lựa chọn với Application.Current.RequestedTheme

biết thêm chi tiết: https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.application.requestedtheme

0

Đăng ký để App_Resuming không làm việc cho tôi vì đây sự kiện không được nâng lên khi ứng dụng không bị treo. Tôi phải nghe số Window.Current.CoreWindow.VisibilityChanged += CoreWindow_VisibilityChanged;

Không cần Task.Delay với giải pháp này.

Các vấn đề liên quan