Получение окна "Цвет окна" - PullRequest
3 голосов
/ 12 октября 2011

Я работаю над приложением 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

1 Ответ

4 голосов
/ 13 октября 2011

Вы хотите получить оттенок стекла Aero в Windows Vista и 7? Вы можете получить к нему доступ с помощью недокументированного сообщения P / Invoke, как описано в этом вопросе и на некоторых других страницах, на которые он ссылается, наиболее важно в этой статье .

В частности, вам нужно использовать следующую функцию Windows:

// In a static NativeMethods class
[DllImport("dwmapi.dll", EntryPoint = "#127")]
static extern void DwmGetColorizationParameters(ref DWMCOLORIZATIONPARAMS dp);

С DWMCOLORIZATIONPARAMS, определенным так:

[StructLayout(LayoutKind.Sequential)]
public struct DWMCOLORIZATIONPARAMS
{
    public UInt32 ColorizationColor;
    public UInt32 ColorizationAfterglow;
    public UInt32 ColorizationColorBalance;
    public UInt32 ColorizationAfterglowBalance;
    public UInt32 ColorizationBlurBalance;
    public UInt32 ColorizationGlassReflectionIntensity;
    public UInt32 ColorizationOpaqueBlend;
}

Хотя эта структура выглядит очень много, вас заинтересует только ее ColorizationColor.

Вот как я конвертирую это значение в System.Windows.Media.Color для использования в WPF / Silverlight (все, что для этого нужно, - это несколько битовых сдвигов):

var cParams = new DWMCOLORIZATIONPARAMS();
NativeMethods.DwmGetColorizationParameters(ref cParams);

var windowColor = Color.FromArgb(
    (byte) 255, 
    (byte)(cParams.ColorizationColor >> 16), 
    (byte)(cParams.ColorizationColor >> 8), 
    (byte) cParams.ColorizationColor
);

Единственная проблема, с которой связан связанный вопрос, заключается в том, что он недокументирован, поэтому может измениться или исчезнуть в любое время (я даже не знаю наверняка, будет ли это работать в интерфейсе рабочего стола Windows 8, но я верю в это должно ). Тем не менее, этот метод работает для меня, и в настоящее время он используется в других приложениях WPF, таких как MetroTwit , что поразительно. И действительно, я бы лучше использовал это, чем сверлял в реестре.

...