XAML分组列表视图:更改行背景颜色

时间:2013-10-05 10:34:09

标签: c# .net xaml listview windows-runtime

我是iOS开发人员,现在我正在接近.net windows 8商店应用程序开发。 好吧,我有这个问题:我用XAML创建了一个分组列表视图:

<ListView Margin="0,10,50,50"
          x:Name="listView"
          AutomationProperties.AutomationId="listView"
          AutomationProperties.Name="Grouped Items"
          Grid.Row="1"
          Background="LightGray"
          BorderBrush="#FF818181"
          ItemsSource="{Binding Source={StaticResource groupedIndexViewSource}}"
          ItemTemplate="{StaticResource StandardSubIndexNOIcon320x70ItemTemplate}"
          BorderThickness="0,1,1,1"
          SelectionMode="None"
          IsSwipeEnabled="false"
          IsItemClickEnabled="True"
          ItemClick="itemClicked">
  <ListView.GroupStyle>
    <GroupStyle>
      <GroupStyle.HeaderTemplate>
        <DataTemplate>
          <Grid x:Name="Prr"
                Width="315"
                Margin="-5,0,0,2"
                Height="70"
                Background="#FFB9B9B9">
            <Button Width="315"
                    Height="70"
                    Margin="0"
                    Click="HeaderClicked"
                    BorderThickness="0"
                    BorderBrush="{x:Null}"
                    Foreground="{x:Null}"
                    Background="{x:Null}"
                    Padding="0">
              <Grid>
                <Grid.ColumnDefinitions>
                  <ColumnDefinition Width="260" />
                  <ColumnDefinition Width="50" />
                </Grid.ColumnDefinitions>

                <TextBlock Grid.Column="0"
                           Width="250"
                           Margin="10,0,0,0"
                           Text="{Binding Title}"
                           Style="{StaticResource BodyTextStyle}"
                           TextWrapping="NoWrap"
                           FontSize="20"
                           Foreground="#DE000000"
                           VerticalAlignment="Center"
                           TextAlignment="Left"
                           HorizontalAlignment="Left" />
              </Grid>
            </Button>
          </Grid>
        </DataTemplate>
      </GroupStyle.HeaderTemplate>
    </GroupStyle>
  </ListView.GroupStyle>
</ListView>

现在,我想更改headerTemplate中定义的标题按钮的背景颜色,因此,在我的c#代码中我定义了这个方法:

private void HeaderClicked(object sender, RoutedEventArgs e)
    {
        ((Grid)((Button)e.OriginalSource).Parent).Background = new SolidColorBrush(Colors.DarkBlue);
}

问题是这条指令只是被忽略了。

你能帮我解决这个问题吗?

提前致谢。

更新

在DanM的帮助下,我发现我确实在这个属性上遇到了问题: ((Grid)((Button)e.OriginalSource)。Parent).Background predefinite type'Microsoft.CSharp.RuntimeBinder.Binder'未定义或导入

这是来自意大利语的英语翻译(我的意思是意大利语)。

当我进入参考文献 - >添加reference-&gt; assembly-&gt;框架时,我只能看到一条消息,说我已经对框架进行了所有引用,并且我需要使用“对象查看器”来探索框架中的参考资料......

我不确定这意味着什么...

2 个答案:

答案 0 :(得分:1)

唯一突然出现的问题是,或许你应该使用Transparent而不是x:Null作为你的Button画笔。

因此,您的按钮标记将变为:

<Button Width="315"
        Height="70"
        Margin="0"
        Click="HeaderClicked"
        BorderThickness="0"
        BorderBrush="Transparent"
        Foreground="Transparent"
        Background="Transparent"
        Padding="0">

如果这确实有效,那将是因为具有透明背景的按钮仍然接受单击事件,而具有空背景的按钮可能不会。

答案 1 :(得分:0)

不要这样做。不要从代码中更改UI元素。而是数据绑定他们。您可以使用转换器来触发按钮。将按钮本身数据绑定到新的bool属性(Selected),并连接到转换器。

<Button BackGroud="{Bind Selected, Converter={StaticResource selectedToBrushConverter}}" />

有很多文章介绍如何在互联网上使用转换器。

您可以做的另一件事是将按钮的样式设置为资源键。然后,您可以将触发器定义为GotFocus和LostFocus属性。在gotfocus上将颜色设置为一种颜色,将丢失的焦点设置为另一种颜色。

这是我允许应用于所有按钮的模板之一。您可以设置特定键,并将按钮绑定到styla。

<Style TargetType="{x:Type Button}">
    <Setter Property="Margin" Value ="1" />
    <Setter Property="Background" Value="Gray" />
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="Foreground" Value="White" />
    <Setter Property="BorderThickness" Value="1" />
    <Setter Property="BorderBrush" Value="White" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}" >
                <Border Background="{TemplateBinding Background}" Opacity="{TemplateBinding Opacity}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" CornerRadius="3">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="3"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Setter Property="Background" Value="DarkOrange" />
        </Trigger>
        <Trigger Property="IsPressed" Value="True">
            <Setter Property="Background" Value="White" />
            <Setter Property="Foreground" Value="Gray" />
            <Setter Property="Opacity" Value="0.95" />
            <!--<Setter Property="BorderThickness" Value="2" />-->
        </Trigger>
        <Trigger Property="IsFocused" Value="True">
            <Setter Property="Background" Value="#82A3FF" />
        </Trigger>

        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Background" Value="DarkGray" />
        </Trigger>
    </Style.Triggers>

</Style>

这样你就不需要做任何事件处理;)