Я работаю над приложением WPF и работаю с диалоговым элементом управления Telerik, который отображается как окно, но на самом деле не является объектом Window.
Поскольку это не фактическое окно (но оно выглядит и действует как единое целое), его стиль не соответствует остальным диалоговым окнам, используемым в моем приложении.
Итак, я создал шаблон для этого диалога, и я нахожусь в процессе назначения системных цветов для шаблона, чтобы диалог использовал те же цвета и имел тот же внешний вид, что и обычное окно.
По какой-то причине я не могу найти системный цвет для "цвета окна" (не цвет фона окна, который довольно легко найти ... Я говорю о реальном цвете окна ... рамка и заголовок окна)
Я прошел все System.Windows.SystemColors , но не могу найти системный цвет, который определяет "Цвет окна" ... как я уже сказал, я не хочу ссылки на "цвет фона окна".
Мне было интересно, знает ли кто-нибудь о том, как получить этот цвет.
Edit:
Вот некоторый код, который я реализовал в своих попытках определить, какой системный цвет используется для цвета окна.
Следующий код WPF представляет собой набор границ, фоны которых настроены на каждый доступный системный цвет ... текстовый блок с именем системного цвета находится внутри каждой границы.
Если вы хотите проверить это сами, поместите в окно или что-то подобное, чтобы вы могли это увидеть:
<ScrollViewer>
<StackPanel>
<-- here I had another Stack Panel referencing the Brushes
instead of using the Keys. I wanted the application to be dynamic
so that if the user changed colors it would be reflected in
the application on the fly...-->
<StackPanel>
<StackPanel.Resources>
<Style TargetType="TextBlock">
<Setter Property="Foreground" Value="White" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Center"/>
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect BlurRadius="4" Color="Black" ShadowDepth="0"/>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="Border">
<Setter Property="BorderBrush" Value="Red"/>
<Setter Property="BorderThickness" Value="1" />
<Setter Property="Margin" Value="2"/>
<Setter Property="Height" Value="20"/>
</Style>
</StackPanel.Resources>
<Border>
<Border.Background>
<SolidColorBrush Color="{DynamicResource {x:Static SystemColors.WindowColorKey}}"/>
</Border.Background>
<TextBlock Text="SystemColors.WindowColorKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.ActiveBorderBrushKey}}" >
<TextBlock Text="SystemColors.ActiveBorderBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.ActiveCaptionBrushKey}}" >
<TextBlock Text="SystemColors.ActiveCaptionBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.ActiveCaptionTextBrushKey}}" >
<TextBlock Text="SystemColors.ActiveCaptionTextBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.AppWorkspaceBrushKey}}" >
<TextBlock Text="SystemColors.AppWorkspaceBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" >
<TextBlock Text="SystemColors.ControlBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}" >
<TextBlock Text="SystemColors.ControlDarkBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.ControlDarkDarkBrushKey}}" >
<TextBlock Text="SystemColors.ControlDarkDarkBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.ControlLightBrushKey}}" >
<TextBlock Text="SystemColors.ControlLightBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.ControlLightLightBrushKey}}" >
<TextBlock Text="SystemColors.ControlLightLightBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" >
<TextBlock Text="SystemColors.ControlTextBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}" >
<TextBlock Text="SystemColors.DesktopBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.GradientActiveCaptionBrushKey}}" >
<TextBlock Text="SystemColors.GradientActiveCaptionBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.GradientInactiveCaptionBrushKey}}" >
<TextBlock Text="SystemColors.GradientInactiveCaptionBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" >
<TextBlock Text="SystemColors.GrayTextBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}" >
<TextBlock Text="SystemColors.HighlightBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}" >
<TextBlock Text="SystemColors.HighlightTextBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.HotTrackBrushKey}}" >
<TextBlock Text="SystemColors.HotTrackBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.InactiveBorderBrushKey}}" >
<TextBlock Text="SystemColors.InactiveBorderBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.InactiveCaptionBrushKey}}" >
<TextBlock Text="SystemColors.InactiveCaptionBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.InactiveCaptionTextBrushKey}}" >
<TextBlock Text="SystemColors.InactiveCaptionTextBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.InfoBrushKey}}" >
<TextBlock Text="SystemColors.InfoBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.InfoTextBrushKey}}" >
<TextBlock Text="SystemColors.InfoTextBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.MenuBrushKey}}" >
<TextBlock Text="SystemColors.MenuBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.MenuBarBrushKey}}" >
<TextBlock Text="SystemColors.MenuBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.MenuHighlightBrushKey}}" >
<TextBlock Text="SystemColors.MenuHighlightBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.MenuTextBrushKey}}" >
<TextBlock Text="SystemColors.MenuTextBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.ScrollBarBrushKey}}" >
<TextBlock Text="SystemColors.ScrollBarBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}" >
<TextBlock Text="SystemColors.WindowBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" >
<TextBlock Text="SystemColors.WindowFrameBrushKey" />
</Border>
<Border Background="{DynamicResource {x:Static SystemColors.WindowTextBrushKey}}" >
<TextBlock Text="SystemColors.WindowTextBrushKey" />
</Border>
</StackPanel>
</StackPanel>
</ScrollViewer>
Спасибо за вашу помощь
Edit:
Вот опубликованная версия решения C # для VB.NET.
Вы можете привязать свойство WindowColorBrush для установки таких вещей, как цвет фона элементов управления в стилях WPF:
Public Class WindowsBackgroundRetriever
Implements System.ComponentModel.INotifyPropertyChanged
<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential)> _
Public Structure DWMCOLORIZATIONPARAMS
Public ColorizationColor As UInt32
Public ColorizationAfterglow As UInt32
Public ColorizationColorBalance As UInt32
Public ColorizationAfterglowBalance As UInt32
Public ColorizationBlurBalance As UInt32
Public ColorizationGlassReflectionIntensity As UInt32
Public ColorizationOpaqueBlend As UInt32
End Structure
Private cParams As New DWMCOLORIZATIONPARAMS
<Runtime.InteropServices.DllImport("dwmapi.dll", EntryPoint:="#127")> _
Private Shared Sub DwmGetColorizationParameters(ByRef dp As DWMCOLORIZATIONPARAMS)
End Sub
Private _windowColor As Color
Public Property WindowColor As Color
Get
Return _windowColor
End Get
Set(ByVal value As Color)
_windowColor = value
RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("WindowColor"))
End Set
End Property
Private _windowColorBrush As SolidColorBrush
Public Property WindowColorBrush As SolidColorBrush
Get
If _windowColorBrush Is Nothing Then
_windowColorBrush = New SolidColorBrush(WindowColor)
End If
Return _windowColorBrush
End Get
Set(ByVal value As SolidColorBrush)
_windowColorBrush = value
RaiseEvent PropertyChanged(Me, New System.ComponentModel.PropertyChangedEventArgs("WindowColorBrush"))
End Set
End Property
Public Sub New()
DwmGetColorizationParameters(cParams)
Dim r = BitConverter.GetBytes(cParams.ColorizationColor >> 16)
Dim g = BitConverter.GetBytes(cParams.ColorizationColor >> 8)
Dim b = BitConverter.GetBytes(cParams.ColorizationColor)
WindowColor = Color.FromArgb(BitConverter.GetBytes(255)(0), r(0), g(0), b(0))
End Sub
Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
End Class