设置元素不透明度不同于窗口

时间:2014-03-19 15:02:21

标签: wpf window opacity

我想知道是否可以:

  • 我有一个带有listview的窗口(Window1)。双击此listview的元素(Element1)打开小弹出窗口(Window2)。
  • 我想将Element1和Window2不透明度设置为1,但将Window1设置为0.2

Window2以ShowDialog()为最顶层.HasValue,如

    this.Opacity = 0.2;
    selected.opacity = 1;
    Window2.opacity = 1;
    if(Window2.ShowDialog().HasValue())
        this.Opacity = 1;

@EDIT: 主窗口,名为" Window1":

private void Border_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (e.ClickCount == 2)
            {
                if (popup != null)
                    popup.Close();
                popup = new PopupWindow(ListView.SelectedItem as SelectedItem, sender as Border, this);
                popup.Topmost = true;
                ((Border)sender).Opacity = 1;
                this.Opacity = 0.2;
                popup.Opacity = 1;
                if (popup.ShowDialog().HasValue)
                {
                    this.Opacity = 1;
                }
            }
        }

1 个答案:

答案 0 :(得分:1)

不幸的是,您尝试实现的目标无法通过WPF直接完成,因为Opacity值是由子控件继承的。来自MSDN上的UIElement.Opacity Property页:

  

不透明度从元素树下的父元素应用到子元素,但嵌套不透明度设置的可见效果未在各个子元素的属性值中指示。例如,如果列表具有50%(0.5)的不透明度,并且其中一个列表项的自身不透明度设置为20%(0.2),则该列表项的净可见不透明度将呈现为10%( 0.1),但查询时列表项Opacity属性的属性值仍为0.2。

但是, 可能会伪造您想要的外观,方法是使Window内的某些元素半透明,同时仍然有Opacity="1.0"子元素。因此,请尝试从Opacity中移除Window设置,而是将Background设置为透明色,如下所示:

window.Background = new SolidColorBrush(Color.FromArgb(0, 0, 0, 0));

甚至更简单:

window.Background = Brushes.Transparent;

在某些UI元素上使用透明色和低Opacity值的组合可以最终获得您想要的效果。