質問

白黒のアプリケーションがあり、輝度を下げる機能が必要なのですが、どうすればいいですか?すべての白は、ResourceDictionary(Application.xaml)に保存されているSolidColorBrushからのものです。現在の解決策は、80%の不透明度で戻った空のウィンドウを置くことですが、これにより、基になるウィンドウを使用できません。

役に立ちましたか?

解決

すべてのUI要素が同じBrushを使用している場合、輝度を下げるためにBrushesを変更するだけではどうですか?例:

public void ReduceBrightness()
{
    var brush = Application.Resources("Brush") as SolidColorBrush;
    var color = brush.Color;
    color.R -= 10;
    color.G -= 10;
    color.B -= 10;
    brush.Color = color;
}

凍結中のApplicationに関するコメントの後に編集します:

Windowクラスを介して)組み込みブラシの1つを使用している場合、フリーズされます。それらのいずれかを使用する代わりに、凍結せずに独自のResourcesを宣言します。

<SolidColorBrush x:Key="Brush">White</SolidColorBrush>

アプリケーションレベルのリソースに関するRobertのコメントの後に編集します。

ロバートは正しい。 <=>レベルで追加されたリソースは、フリーズ可能であれば自動的にフリーズされます。凍結しないように明示的に要求した場合でも:

<SolidColorBrush x:Key="ForegroundBrush" PresentationOptions:Freeze="False" Color="#000000"/>

これを回避する方法は2つあります。

  1. ロバートが示唆したように、リソースをリソースツリーの下位レベルに配置します。たとえば、<=>の<=>コレクション内。これにより、共有が難しくなります。
  2. フリーズできないラッパーにリソースを配置します。

#2の例として、以下を考慮してください。

App.xaml

<Application.Resources>
    <FrameworkElement x:Key="ForegroundBrushContainer">
        <FrameworkElement.Tag>
            <SolidColorBrush PresentationOptions:Freeze="False" Color="#000000"/>
        </FrameworkElement.Tag>
    </FrameworkElement>
</Application.Resources>

Window1.xaml

<StackPanel>
    <Label Foreground="{Binding Tag, Source={StaticResource ForegroundBrushContainer}}">Here is some text in the foreground color.</Label>
    <Button x:Name="_button">Dim</Button>
</StackPanel>

Window1.xaml.cs

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        _button.Click += _button_Click;
    }

    private void _button_Click(object sender, RoutedEventArgs e)
    {
        var brush = (FindResource("ForegroundBrushContainer") as FrameworkElement).Tag as SolidColorBrush;
        var color = brush.Color;
        color.R -= 10;
        color.G -= 10;
        color.B -= 10;
        brush.Color = color;
    }
}

それほどきれいではありませんが、今のところ思いつく最高のものです。

他のヒント

ブラシを修正するのではなく、ルート要素の不透明度を変更することでこれを解決しましたが、どうにかできるかどうかを教えてもらえたらいいと思います。

SolidColorBrushが下位レベルのリソースに追加された場合、

Kentのソリューションは機能します。フリーズ可能ファイルは、Application.Resourcesに追加されると自動的にフリーズされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top