WPF에서 고 대비를 지원하고 싶습니다.

7736 단어 WPF
가장 좋은 방법인지는 모르겠지만, 다음과 같은 느낌으로 할 수 있었습니다.
  • SystemParameters.HighContrastKey 첨부 속성에 바인딩
  • 그 값을 트리거로하여 스타일 설정을 나눕니다

  • 해보자


    SystemParameters.HighContrastKeyDynamicResource 마크업 확장으로 가져오면 고대비 설정이 바뀔 때 동적으로 값이 바뀌게 됩니다.
    그것을 적당한 자작 첨부 프로퍼티에 바인드 하는 것으로 하이 콘트라스트의 설정이 바뀌었을 때에 값이 바뀌는 표시로서 사용할 수 있습니다. 그리고는, 그 첨부 프로퍼티의 값을 트리거로 해 설정하는 색을 Style 로 설정하도록(듯이) 해야 했습니다.

    높은 콘트라스트인지 여부를 유지하기 위한 첨부 속성입니다.

    HighContrast.cs
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    
    namespace WpfHighContrast
    {
        public class HighContrast
        {
            public static bool GetValue(DependencyObject obj)
            {
                return (bool)obj.GetValue(ValueProperty);
            }
    
            public static void SetValue(DependencyObject obj, bool value)
            {
                obj.SetValue(ValueProperty, value);
            }
    
            public static readonly DependencyProperty ValueProperty =
                DependencyProperty.RegisterAttached("Value", typeof(bool), typeof(HighContrast), new PropertyMetadata(false));
        }
    }
    

    그리고 이것을 사용해 Style 로 색을 낼 수 있습니다. 예로서 TextBox 의 배경색과 전경색을 바꾸어 보았습니다.

    MainWindow.xaml
    <Window x:Class="WpfHighContrast.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfHighContrast"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <StackPanel>
            <TextBox>
                <TextBox.Style>
                    <Style TargetType="TextBox">
                        <!-- ハイコントラストの設定が変わると、この添付プロパティの値が変わる -->
                        <Setter Property="local:HighContrast.Value" Value="{DynamicResource {x:Static SystemParameters.HighContrastKey}}" />
                        <Style.Triggers>
                            <!-- データトリガーで色の設定を分ける -->
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(local:HighContrast.Value)}" Value="False">
                                <Setter Property="Foreground" Value="White" />
                                <Setter Property="Background" Value="ForestGreen" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=(local:HighContrast.Value)}" Value="True">
                                <!-- もし独自色を出したければここに設定 -->
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBox.Style>
            </TextBox>
        </StackPanel>
    </Window>
    

    실행 결과



    고대비 설정을 하지 않은 상태에서 기동합니다.



    시작된 상태에서 Windows 10 설정에서 고대비를 켭니다.



    런타임에 제대로 색이 바뀌고 있네요. 하이 콘트라스트가 아닌 경우는 독자적인 색으로 하이 콘트라스트의 경우는, 하이 콘트라스트의 설정으로 지정된 색을 우선 (이것이 WPF 의 컨트롤의 디포의 거동) 하게 되어 있습니다.

    좋은 웹페이지 즐겨찾기