標籤:uicolor ack file lock 顏色 事件 etc ima 系統
有些時候,希望應用程式中的某些顏色可以與系統的佈景主題色彩相同,並且當系統主題色改變時進行同步。
實現過程並不複雜,主要用到 UISettings 類,它公開一個 GetColorValue 方法,訪問這個方法,可以得到指定的顏色值(用Color結構表示)。而表示要擷取顏色的類型由一個叫 UIColorType 的枚舉來約定。如下面超高清所示。
可能有朋友在調用 GetColorValue 方法時會使用值 Background,其實這個值不是系統主題色,是視窗的背景色,預設情況返回的都是白色。系統主題色是值 Accent (即所謂的強調色)。
另外大夥會看到好N個以 Accent 開頭的值,如 AccentDark1、AccentLight2等。這些值的意思就是,在 Accent 值的基礎上加深或者淺化。比如,Accent 值返回藍色,那麼,AccentLight1 表示相對於 Accent 值稍淺一點的藍色;AccentLight2 再淺一點;AccentLight3 再再淺一點。至於說淺多少,深多少,這個你自己研究研究吧。
下面給大夥看看實測效果,為了雅觀,先弄個UI。
<Grid HorizontalAlignment="Center" VerticalAlignment="Center"> <Grid.RowDefinitions> <RowDefinition Height="auto"/> <RowDefinition Height="auto"/> </Grid.RowDefinitions> <Rectangle Name="rect" Width="300" Height="250" Margin="15" Stroke="Red" StrokeThickness="3"/> <TextBlock Margin="12" Grid.Row="1" Text="注意看上面的矩形。" FontSize="16"/> </Grid>
這段 XAML 不複雜,要是看不懂的話,可以去諮詢濟公。主要的元素是那個矩形,待會咱們讓它的填充顏色跟隨系統的主題色。
那麼,有大夥伴會問了,當系統主題色更改後,我的應用程式怎麼得到通知呢?別緊張,君不見,UISettings 類有個 ColorValuesChanged 事件嗎,這就對了,如果系統主題色改變,就會引發這個事件。所以,聰明的你一定知道後面的思路了,對,就是響應這個事件,給填充矩形的畫刷改變顏色即可。
不過,有一點你得嚴重注意,這個事件是在另一個線程上調用的,所以,你要訪問 UI 元素的話,不要忘了帶上 Dispatcher。
比如這樣。
uisetting = new UISettings(); uisetting.ColorValuesChanged += OnColorValuesChanged; private async void OnColorValuesChanged(UISettings sender, object args) { Color bg, fg; bg = sender.GetColorValue(UIColorType.Accent); await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { SolidColorBrush brush = rect.Fill as SolidColorBrush; if (brush == null) { brush = new SolidColorBrush(); } brush.Color = bg; }); }
代碼很 Easy,但效果很性感。不信你試試。
是不是很性感呢?
程式碼
【Windows 10 應用開發】跟隨系統佈景主題色彩