質問
白黒のアプリケーションがあり、輝度を下げる機能が必要なのですが、どうすればいいですか?すべての白は、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つあります。
- ロバートが示唆したように、リソースをリソースツリーの下位レベルに配置します。たとえば、<=>の<=>コレクション内。これにより、共有が難しくなります。
- フリーズできないラッパーにリソースを配置します。
#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
に追加されると自動的にフリーズされます。