English 中文(简体)
WPF 更改亮度
原标题:
  • 时间:2009-03-17 11:40:04
  •  标签:

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

最佳回答

如果您的所有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;
}

在你对“画刷”被冻结的评论后进行编辑:

如果您正在使用内置刷子之一(通过Brushes类),则它将被冻结。而不是使用其中之一,请声明您自己的刷子,但不要将其冻结:

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

在罗伯特对应用程序级资源的评论之后进行编辑:

罗伯特是对的。在 应用程序 级别添加的资源如果可以冻结,则会自动冻结。即使您明确要求它们不要被冻结:

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

我可以看到有两种解决这个问题的方法:

  1. As Robert suggested, put the resource at a lower level in the resource tree. For example, in a Window s Resources collection. This makes it harder to share though.
  2. Put the resource in a wrapper that is not freezable.

作为第二个例子,考虑以下情况。

App.xaml:

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

Window1.xaml:窗口1.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: 窗口1.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的解决方案将有效。当Freezables被添加到Application.Resources时,它们会自动冻结。





相关问题
热门标签