2010-02-03 47 views
3

我有一個模板ListBoxWPF列表框:如何更改所選項目上點擊使用XAML

<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才能做到這一點(更新點擊按鈕上的選定項目)?

回答

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> 
0

A ListBox跟蹤並選擇當前項目給你,你不需要在代碼中完成。刪除該內容

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

您正在爲您開箱即用的工作。

1

您的DataTemplate中定義的按鈕將在ListBoxItem可以處理它之前攔截點擊事件。從DataTemplate中刪除ItemContainerStyleButton

<ListBox.ItemTemplate> 
    <DataTemplate> 
    <StackPanel> 
    <Image Source="{Binding Icon}" MaxHeight="32" MaxWidth="32"/> 
    <TextBlock Text="{Binding Label}"/> 
    </StackPanel> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
+0

事實上,按鈕被攔截的點擊,但我不想刪除它,我想保持Button的外觀和感覺 –

相關問題