3

我有一个模板ListBox

<ListBox Grid.Row="0" Grid.Column="1" Background="Transparent" BorderThickness="0" x:Name="mainMenu"
    ItemsSource="{Binding Source={x:Static local:MenuConfig.MainMenu},  Mode=OneTime}"
   IsSynchronizedWithCurrentItem="True">
 <ListBox.ItemContainerStyle>
  <Style TargetType="ListBoxItem">
   <EventSetter Event="PreviewMouseUp" Handler="SelectCurrentItem"/>
  </Style>
 </ListBox.ItemContainerStyle>
 <ListBox.ItemsPanel>
  <ItemsPanelTemplate>
   <StackPanel Orientation="Horizontal"></StackPanel>
  </ItemsPanelTemplate>
 </ListBox.ItemsPanel>
  <ListBox.ItemTemplate>
  <DataTemplate>
   <Button>
    <StackPanel>
     <Image Source="{Binding Icon}" MaxHeight="32" MaxWidth="32"/>
     <TextBlock Text="{Binding Label}"/>
    </StackPanel>
   </Button>
  </DataTemplate>
 </ListBox.ItemTemplate>
</ListBox>

所选项目使用后面的代码手动更新:

private void SelectCurrentItem(object sender, MouseButtonEventArgs e)
{
    ListBoxItem item = (ListBoxItem) sender;
    item.IsSelected = true;
}

有没有办法仅使用 XAML 来执行此操作(单击按钮时更新所选项目)?

4

3 回答 3

1

您定义的按钮将在处理它DataTemplate之前拦截点击事件。ListBoxItem从您ItemContainerStyle的.ButtonDataTemplate

<ListBox.ItemTemplate> 
  <DataTemplate> 
    <StackPanel> 
     <Image Source="{Binding Icon}" MaxHeight="32" MaxWidth="32"/> 
     <TextBlock Text="{Binding Label}"/> 
    </StackPanel> 
   </DataTemplate> 
 </ListBox.ItemTemplate> 
于 2010-02-04T05:38:19.377 回答
1

通常,DataTemplate如果这是您想要的效果,您可以将您的外观和响应设置为按钮,例如

<ListBox.ItemTemplate>
    <DataTemplate>
        <Border BorderBrush="Black" BorderThickness="3" CornerRadius="10" Background="#FFD6D3D3" Margin="5">
            <Border x:Name="myBorder" BorderBrush="#FFD6D3D3" BorderThickness="4" CornerRadius="10" Padding="2">
                <Border.Background>
                    <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1" >
                        <GradientStop Color="#FFA5A5A5" Offset="1"/>
                        <GradientStop Color="White"/>
                    </LinearGradientBrush>
                </Border.Background>
                <StackPanel>
                    <Image Source="{Binding Icon}" MaxHeight="32" MaxWidth="32"/>
                    <TextBlock x:Name="TxtContent" Text="{Binding Label}"/>
                </StackPanel>
            </Border>
        </Border>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True">
                <Setter TargetName="myBorder" Property="Background">
                    <Setter.Value>
                        <LinearGradientBrush StartPoint="0.5,1" EndPoint="0.5,0">
                            <GradientStop Color="#FFA5A5A5" Offset="1"/>
                            <GradientStop Color="White" />
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
                <Setter TargetName="TxtContent" Property="RenderTransform" >
                    <Setter.Value>
                        <TranslateTransform Y="2.0" />
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</ListBox.ItemTemplate>

您可能还需要设置ItemContainerStyle以覆盖的默认样式SelectedItem

<ListBox.ItemContainerStyle>
    <Style TargetType="{x:Type ListBoxItem}" >
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                    <ContentPresenter />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ListBox.ItemContainerStyle>
于 2010-02-05T03:56:30.660 回答
-1

AListBox为您跟踪并选择当前项目,您无需在代码中执行此操作。删除这个

 <ListBox.ItemContainerStyle>
  <Style TargetType="ListBoxItem">
   <EventSetter Event="PreviewMouseUp" Handler="SelectCurrentItem"/>
  </Style>
 </ListBox.ItemContainerStyle>

您正在为您完成开箱即用的工作。

于 2010-02-03T22:54:23.953 回答