WPF将背景设置为透明和在控件上设置不透明度有什么区别?

时间:2013-12-05 21:01:54

标签: c# wpf xaml

所以我意识到我的图形查看器的轴显示在图形中的实际项目上,因此我更改了网格上的ZIndex以显示轴上的项目。

然而,我注意到我实际上看不到任何物品,因为物品的背景是不透明的。我想我有两个选项,要么将项目的背景设置为透明,要么设置项目的不透明度。这两个选项有什么区别吗?

              <Grid 
                Grid.Row="0" 
                Grid.RowSpan="2"
                Grid.Column="0" 
                Grid.ZIndex="1"
                >
                <Components:SignalGraphAxis 
                  x:Name="signal_axis"
                  VerticalAlignment="Stretch"
                  HorizontalAlignment="Stretch"
                  GraphHeight="{Binding Path=GraphHeight}"
                  PenColor="{Binding Path=AxisColor, Mode=OneWay}"
                  PenWidth="{Binding Path=GraphPenWidth, Mode=OneWay}"
                  MinHeight="10"
                  MinWidth="10"
                  AxisTimeScale="{Binding Path=GraphTimeScale}"
                  NumberOfPixelsPerDivision="{Binding Path=NumberOfPixelsPerDivision, Mode=OneWay}"
                  MinDisplayValue ="{Binding Path=MinDisplayValue, Mode=OneWay}"
                  UnitsOfGraphTimePerInch="{Binding Path=UnitsOfTimePerInch, Mode=OneWay}"
                  />
              </Grid>
              <ScrollViewer
                x:Name="signal_scrollviewer"
                Grid.Row="1"
                Grid.RowSpan="2"
                Grid.Column="0"
                Grid.ColumnSpan="2"
                Grid.ZIndex="2"
                VerticalAlignment="Stretch" 
                HorizontalAlignment="Stretch"
                HorizontalContentAlignment="Left"
                HorizontalScrollBarVisibility="Visible"
                VerticalScrollBarVisibility="Visible"
                CanContentScroll="True"
                Style="{StaticResource SignalScrollViewerStyle}"
                >

                <ItemsPresenter />
              </ScrollViewer>
            </Grid>

1 个答案:

答案 0 :(得分:3)

Background属性在Control上定义,OpacityUIElement上定义得更高。

来自MSDN网页Control.Background Property

  

此属性仅影响其模板使用的控件   背景属性作为参数。在其他控件上,此属性   没有影响。

让我们尝试创建一个自定义控件,看看它是如何工作的。

<强> CustomControl1.cs

public class CustomControl1 : ContentControl
{
    static CustomControl1()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
    }
}

CustomControl1的默认模板

<Style TargetType="{x:Type local:CustomControl1}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <TextBlock Text="My Custom Control " Grid.Row="0" />
                    <ContentPresenter Grid.Row="1" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

请注意,上面的模板完全不使用Background中的Template属性。

现在,让我们尝试在表单中使用它,看看它的行为:

来自Window1.xaml的代码

<Grid>
    <wpfApplication5:CustomControl1 Background="Green">
        <Button Content="Button Within Custom Control" Margin="25"/>
    </wpfApplication5:CustomControl1>
</Grid>

结果输出:

enter image description here

请参阅,即使我们在Window1.xaml中将Background设置为Green,渲染的CustomControl也没有绿色背景。

现在,让我们修改模板以使用Background属性。

具有背景属性的模板

<Style TargetType="{x:Type local:CustomControl1}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Grid Background="{TemplateBinding Background}">
                    <Grid.RowDefinitions>
                        <RowDefinition />
                        <RowDefinition />
                    </Grid.RowDefinitions>
                    <TextBlock Text="My Custom Control " Grid.Row="0" />
                    <ContentPresenter Grid.Row="1" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

结果输出现在将应用指定的背景。

enter image description here

我认为(虽然找不到任何引用),Opacity会应用于元素/ Control,无论Control的模板是否担心Opacity属性。

在CustomControl上设置不透明度的Window1.xam

<Grid>
    <wpfApplication5:CustomControl1 Background="Green" Opacity="0.2">
        <Button Content="Button Within Custom Control" Margin="25"/>
    </wpfApplication5:CustomControl1>
</Grid>

和结果输出

enter image description here

请参阅,即使我们的自定义控件模板对Opacity属性没有任何担忧,也会应用Opacity。

最后,要回答您的问题:虽然将Opacity设置为0Background设置为Transparent可能会为您提供相同的视觉效果。但是,对于Background属性,它完全取决于Control实现以及它如何处理Background属性。然而,随着Opacity,它将从父元素应用到元素树到子元素,而不管控件如何。

请参阅MSDN页面,UIElement.Opacity Property以了解有关“不透明度”属性的更多信息,以及在元素树中将不透明度设置为多个级别时的行为方式。