WPF改变亮度

时间:2009-03-17 11:40:04

标签: wpf brightness

我有一个黑白应用程序,我需要一个降低亮度的功能,我该怎么办?所有白色都来自保存在ResourceDictionary(Application.xaml)中的SolidColorBrush,我当前的解决方案是放置一个空窗口,它上面有80%的不透明度,但这不允许我使用底层窗口..

3 个答案:

答案 0 :(得分:5)

如果您的所有UI元素都使用相同的Brush,为什么不修改Brush以降低亮度?例如:

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;
}

在对Brush被冻结的评论后进行修改:

如果您正在使用其中一个内置画笔(通过Brushes类),那么它将被冻结。而不是使用其中之一,声明自己的Brush而不冻结它:

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

罗伯特对应用级资源发表评论后编辑:

罗伯特是对的。如果Application级别添加的资源可以冻结,则会自动冻结。即使你明确要求他们不要被冻结:

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

我可以通过以下两种方式看到:

  1. 正如Robert建议的那样,将资源放在资源树的较低级别。例如,在Window的{​​{1}}集合中。这使得分享更加困难。
  2. 将资源放在一个不可冻结的包装器中。
  3. 作为#2的一个例子,请考虑以下内容。

    的App.xaml

    Resources

    Window1.xaml

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

    Window1.xaml.cs

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

    它不是那么漂亮,但它是我现在能想到的最好的。

答案 1 :(得分:0)

通过更改我的根元素的不透明度而不是尝试修改画笔来解决这个问题,但是如果有人告诉我是否可以做一些如何或不可能的事情,它仍然会很好。

答案 2 :(得分:0)

如果将SolidColorBrush添加到较低级别的资源,Kent的解决方案将起作用。 Freezables在添加到Application.Resources时会自动冻结。