【问题标题】:Preventing TV / Monitor burn in, in a WPF program [closed]在 WPF 程序中防止 TV / Monitor 烧屏 [关闭]
【发布时间】:2014-09-20 03:05:39
【问题描述】:

我最近为一个客户完成了一个 WPF 程序,该程序每天至少 12 小时(甚至可能超过 16 小时)在容易老化的电视上使用。问题是,数据几乎是静态的(一些文本每隔几个小时就会更改一次,但在大多数情况下它是静态的)。另一个问题是设计非常具体,需要保持这种状态——所以我不能随意移动元素。我也不能做任何戏剧性的事情,比如让一些东西在屏幕上弹跳,因为屏幕会显示重要信息。

所以,我正在努力寻找一种防止烧伤的方法。有什么好的方法可以防止这种情况?最好在 WPF 中。客户和我提出了可能解决方案,让 AHK 脚本每小时触发一次屏幕保护程序,但这似乎真的很hacky。

【问题讨论】:

  • 索取图书馆并不是表达问题的好方法,因为这与 SO 无关。但是隐藏文本或切换屏幕的策略会得到一个有趣的答案。
  • 您需要与客户合作并解释问题,必须提供一些东西。防止烧屏的唯一方法是更换屏幕(这就是最初存在屏幕保护程序的原因)。
  • 设置一个计时器并每隔几分钟显示一两秒钟的黑屏可能吗?或者切换显示公司徽标而不是黑屏。
  • 更新了问题,并不是一个糟糕的想法罗德里戈 - 如果一切都失败了,我会这样做,但这可能会中断客户的工作流程,所以它并不理想。
  • @itsme86 - 我可能不得不考虑这一点,但是客户的设计非常具体。如果它是我做的,是的 - 烧录将是我设计的东西,但是是一位平面设计师与我签约制作它......另外,我只是对看到解决方案很感兴趣,这是我的一个问题以前从未处理过。

标签: c# .net wpf television


【解决方案1】:

为什么不只是构建一个混合故事板,在 30 分钟的过程中缓慢地将配色方案更改为不会发生冲突的其他内容,然后再将其更改回来?

【讨论】:

    【解决方案2】:

    通过谷歌快速搜索我发现了这个,它可能很有用。

    CRT 和较旧的等离子电视很容易老化,但许多现代电视都具有旨在降低风险的功能。许多都包含一个称为“像素移动”的功能,例如,它可以将屏幕上的图像移动到足以使像素有规律地变化,(但不是太多以至于你会注意到它)。一些更便宜的等离子可能更容易受到影响,所以这是一个你付出代价的领域。

    话虽如此,也许您可​​以用您的程序模拟相同的效果。您可以将整个视图向左或向右移动几个像素,并在一天中让它们向后移动。可能比说的容易,因为我没有实际的 WPF 经验,但我认为这是一个好主意。

    参考:http://lifehacker.com/5982108/is-burn-in-still-an-issue-on-tvs-and-monitors

    【讨论】:

    • 我有想过,但设计很简单,只包含几种颜色(以及相同颜色的大块),所以它必须不仅仅是像素移位。我想我可以让随机彩色像素(一次几个)在几分钟内遍历整个屏幕?够了吗?
    • 我对“老化”了解不够,但也许您可以向您的客户询问可接受的颜色范围,尽可能亮和暗,然后在一天中增加和减少亮度颜色。然后你有相同的“基本感觉”,但颜色会发生变化。不过,我个人不确定颜色变化必须有多么剧烈才能有效。
    【解决方案3】:

    您能否使用像垂直“刷新栏”这样的东西定期扫过屏幕,drawnexclusive-or 模式下覆盖状态文本和框?

    我所说的“XOR 模式引用条”是指这样的东西,它每隔几分钟就会按照所示箭头的方向在屏幕上爬行:

    【讨论】:

    • 我是按照这些思路考虑的,但不是刷新栏,而是将公司名称拉伸以垂直填充屏幕,看起来有点圆滑
    • 我对 WPF 还很陌生,所以我不确定这是否可行。不过,我很想听听有 WPF 经验的人对此发表评论。
    • @Jon 我非常有信心这将是可能的,可能使用 WPF 像素着色器来完成
    • 好主意,这将确保所有像素都发生变化并且不会太侵入。他可能会将其设置为一两个像素宽,因此它不会那么明显,并且每隔 30 分钟/小时左右一次。我会把这个放在脑后,以备不时之需。
    【解决方案4】:

    新方法的新答案。这要简单得多,并且有动画:

    <Grid x:Name="MyGrid">
        <Grid.Background>
            <SolidColorBrush x:Name="bg" Color="Red"/>
        </Grid.Background>
        <Grid.Triggers>
            <EventTrigger RoutedEvent="Window.Loaded">
                <BeginStoryboard>
                    <Storyboard RepeatBehavior="Forever">
                        <ColorAnimation Storyboard.TargetName="bg"
                                        Storyboard.TargetProperty="Color" 
                                        From="Red" To="Blue" 
                                        Duration="0:0:10" BeginTime="0:0:0"/>
                        <ColorAnimation Storyboard.TargetName="bg"
                                        Storyboard.TargetProperty="Color" 
                                        From="Blue" To="Red" 
                                        Duration="0:0:10" BeginTime="0:0:10"/>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Grid.Triggers>
    </Grid>
    

    将持续时间设置为 30 分钟。当然,这有时会导致颜色呈紫色。我不认为你的客户可以接受,这就是我最初没有建议的原因。

    如果这是不可接受的,一个选项是在切换颜色之前淡出控件。 (为故事板添加两个不透明度的双重动画)。

    【讨论】:

      【解决方案5】:

      这是一个使用DispatcherTimer 每秒切换网格颜色的示例:

      public partial class MainWindow : Window, INotifyPropertyChanged
      {
          private bool _isMainColour;
      
          public SolidColorBrush CurrentColour { get; set; }
      
          private DispatcherTimer _timer;
      
          public MainWindow()
          {
              InitializeComponent();
              DataContext = this;
              _timer = new DispatcherTimer();
              _timer.Interval = new TimeSpan(0, 0, 1);
              _timer.Tick += _timer_Tick;
              _timer.Start();
          }
      
          void _timer_Tick(object sender, EventArgs e)
          {
              if (_isMainColour)
              {
                  CurrentColour = new SolidColorBrush(Colors.Blue);
              }
              else
              {
                  CurrentColour = new SolidColorBrush(Colors.Red);
              }
              _isMainColour = !_isMainColour;
              if (PropertyChanged != null)
              {
                  PropertyChanged(this, new PropertyChangedEventArgs("CurrentColour"));
              }
          }
      
          public event PropertyChangedEventHandler PropertyChanged;
      }
      

      还有 XAML:

      <Window x:Class="WpfApplication4.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="MainWindow" Height="350" Width="525" Background="Black">
          <Grid Background="{Binding CurrentColour}">
      
          </Grid>
      </Window>
      

      显然,它需要更好的结构,但它显示了基本原理。

      【讨论】:

      • 每隔(几)秒切换一次网格的颜色既不美观,也不友好。
      • 这段代码很有帮助,如果其他解决方案不起作用并且客户会接受这个作为解决方案,我一定会使用你的代码。但是,我不会突然改变,而是让它逐渐变化并在颜色之间交替。
      • @CodeCaster:我在其中放了 1 秒,这样 OP 就不必等待 30 分钟进行更改...我认为 OP 能够将 1 更改为更大的值:D
      【解决方案6】:

      我会说使用 DyanmicResource 绑定将颜色绑定到资源是一个好的开始。

      然后您可以在 app.cs 中实现一个计时器,当触发时更新值:

      this.Resource["PrimaryColour"] = Color.FromRgb(200, 200, 200);
      

      【讨论】:

        猜你喜欢
        • 2010-09-23
        • 1970-01-01
        • 2011-12-31
        • 1970-01-01
        • 2013-01-15
        • 2011-06-11
        • 1970-01-01
        • 2016-02-20
        • 2011-02-25
        相关资源
        最近更新 更多