【问题标题】:How to change the opacity of custom elements of ListView如何改变ListView的自定义元素的不透明度
【发布时间】:2014-04-04 07:40:10
【问题描述】:

我有列表视图,我想设置一些元素的opacity,但不幸的是在ListViewItem 上设置opacity 是行不通的......

<Style x:Name="TileStyle" TargetType="ListView">
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Grid Width="185"
                          Height="85"
                          Margin="20"
                          Background="Red"
                          Opacity="0.1">
                        <TextBlock Text="fasada" />
                    </Grid>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

   <ListView x:Name="XListView"
          ItemsSource="{Binding li}"
          Style="{StaticResource TileStyle}" />

仅当我为 ListView 对象设置一个不透明度时它才有效。

我发现article 描述了类似的问题,但XListView.Items[i] 只是int,所以我无法设置它的Opacity...

更新

我忘了说这是Windows-8.1 的程序,所以某些WPF 属性可能不受支持。

【问题讨论】:

  • 如果您使用的是 MVVM 架构,为什么不将其绑定到模型的某些属性。
  • 你的意思是用somoe属性绑定Opacity吗?这是同样的问题,我在开始时提到过(它只是不起作用)。
  • 阅读 user3449857 答案。这就是正在发生的事情。

标签: c# wpf xaml listview windows-8.1


【解决方案1】:

例如。 查看项目的模型:

public class Item
{
    public double Opacity {get;set;}
    public string Value {get;set;}
}

ListView xaml 代码:

<ListView>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="Opacity" Value="{Binding Opacity}" />
            <Setter Property="Content" Value="{Binding Value}" />
        </Style>
    </ListView.ItemContainerStyle>
</ListView>

如果你想在运行时改变不透明度,你应该为你的Item类实现INotifyProperyChanged

【讨论】:

  • 我不需要INotifyPropertyChanged,我想用不同容量的对象初始化ListView。我做了你写的,我已经添加了背景,但它仍然不起作用(不透明度为 0.1 的元素看起来与不透明度等于 0.9 的元素相同)。我的解决方案1drv.ms/1fEJEpa
  • 对不起。无法帮助您,在查看您的代码后,我提到它是 Windows 应用商店应用程序。我什至没有 Windows 8.1 来做一些测试。希望你能找到答案。
【解决方案2】:

卢卡斯在这里 :-)

要成功地将不透明度应用于您的ListViewItem,您将需要这样的东西

<Style x:Key="{x:Type ListViewItem}" TargetType="ListViewItem">
        <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="Opacity" Value="1.0"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ListViewItem">
                    <Border Name="Border" Padding="2" SnapsToDevicePixels="true" Background="Transparent" CornerRadius="15">
                        <GridViewRowPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsSelected" Value="true">
                            <Setter TargetName="Border" Property="Background" Value="{StaticResource SelectedBackgroundBrush}"/>
                            <Setter Property="Opacity" Value="0.4"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                            <Setter Property="Background" Value="WhiteSmoke"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

试一试,让我们知道。 高温

更新

看到你需要的新信息后

<Style x:Key="{x:Type ListViewItem}" TargetType="ListViewItem">
        <Setter Property="SnapsToDevicePixels" Value="true"/>
        <Setter Property="OverridesDefaultStyle" Value="true"/>
        <Setter Property="Opacity" Value="{Binding VM.Property}"/>
    </Style>

虽然这将要求列表中的每个项目都定义不透明度。 您始终可以使用 fallbackValue 来使用默认不透明度 = 1.0

【讨论】:

  • 您好,感谢您的回复,触发器是个好主意,但不幸的是,Windows8.1 不支持它
  • @JakubKuszneruk 你对我的更新有帮助吗?
【解决方案3】:

我正在考虑您要更改 listview 元素的不透明度,即 listviewitem,因此您需要更改 listviewitem 样式,即 Listview Itemcontainerstyle 并通过编辑 listview 项目的模板,您可以将不透明度设置为元素。我正在使用网格来显示 listviewitem 的 3 个解决方法风格。希望这会有所帮助

    <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <!--****************************1st method*******************************-->
    <ListView x:Name="XListView" Grid.Column="0" ItemsSource="{Binding li}" >
        <ListView.Resources>
            <Style TargetType="ListViewItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="ListViewItem">
                            <Grid Width="185" Height="85" Margin="20" Background="Red" Opacity="0.1">
                                <TextBlock Text="TextData"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.Resources>
        <ListViewItem>ListviewItemData1</ListViewItem>
    </ListView>
    <!--**************************2nd method***********************************-->
    <ListView  Grid.Column="1" ItemsSource="{Binding li}" >
        <ListView.Resources>
            <Style TargetType="ListViewItem">
                <Setter Property="ContentTemplate" >
                    <Setter.Value>
                        <DataTemplate>
                            <Grid Width="185" Height="85" Margin="20" Background="Red" Opacity="0.1">
                                <TextBlock Text="TextData"/>
                            </Grid>
                        </DataTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </ListView.Resources>
        <ListViewItem>ListviewItemData1</ListViewItem>
    </ListView>
    <!--*****************3rd method*****************-->
    <ListView Grid.Column="2">
        <ListViewItem >
            <ListViewItem.Template>
                <ControlTemplate TargetType="ListViewItem">
                    <Grid Width="185" Height="85" Margin="20" Background="Red" Opacity="0.1">
                        <TextBlock Text="TextData"/>
                    </Grid>
                </ControlTemplate>
            </ListViewItem.Template>
        </ListViewItem>
    </ListView>
</Grid>

你也可以像这样设置不透明度

 <SolidColorBrush x:Key="RedBrush" Color="Red" Opacity="0.1"></SolidColorBrush>

【讨论】:

    【解决方案4】:
    <Page.Resources>
            <Style x:Key="tootStyle" TargetType="ListViewItem">
                <Setter Property="Opacity" Value="0.1"/>
            </Style>
    </Page.Resources>
    
    
    <ListView ItemContainerStyle="{StaticResource tootStyle}">
                <ListViewItem Background="red">AZERTY</ListViewItem>
                <ListViewItem Background="Green">AZERTY</ListViewItem>
                <ListViewItem Background="Blue">AZERTY</ListViewItem>
                <ListViewItem Background="Purple">AZERTY</ListViewItem>
    </ListView>
    

    【讨论】:

      猜你喜欢
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-29
      • 2021-12-28
      • 2015-07-23
      • 2012-01-26
      • 1970-01-01
      • 2012-01-01
      相关资源
      最近更新 更多