2017-08-24 41 views
0

我試圖改變一些元素的顏色,當他們被選中和鼠標移過它們時。在我第一次嘗試使用ItemsControl和一個邊框來激活顏色變化時,這會給我鼠標上的顏色變化,但我不確定我需要觸發哪個屬性來選擇它,如下所示:IsFocussed不正確:我可以選擇一個邊框嗎?或者我該如何避免打破我的列表框繼承?

<UserControl x:Class="Crp.CodePlusTeamExplorerSectionView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:Crp.ViewModels="clr-namespace:Crp.ViewModels" 
     mc:Ignorable="d" 
     d:DesignHeight="250" d:DesignWidth="300"> 
<UserControl.DataContext> 
    <Crp.ViewModels:RelatedViewsViewModel/> 
</UserControl.DataContext> 
<Control.Resources> 
    <Style x:Key="styleWithTrigger" TargetType="Border"> 
     <Setter Property="Background" Value="Transparent" /> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background" Value="#3E3E40" /> 
      </Trigger> 
      <Trigger Property="IsFocused" Value="True"> 
       <Setter Property="Background" Value="#007ACC" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</Control.Resources> 
<ItemsControl Name="RelatedViewsICtl" ItemsSource="{Binding RelatedViews}" MouseDoubleClick="RelatedViewsLB_MouseDoubleClick"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Border Name="border" VerticalAlignment="Stretch" Height="23" MinHeight="22" Style="{StaticResource styleWithTrigger}"> 
       <StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> 
        <TextBlock Text="" Margin="1"/> 
        <Image Source="Resources\Review.png"/> 
        <TextBlock Text="{Binding Path=Id}" Margin="1"/> 
        <TextBlock Text="-" Margin="1"/> 
        <TextBlock Text="{Binding Path=Name}" Margin="1" /> 
       </StackPanel> 
      </Border> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Vertical"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ItemsControl> 

我曾嘗試另一種方法是將其轉換爲一個ListBox,這似乎是一個更好的辦法,但列表框繼承了正確的屬性停在我的元素,而且我不確定如何修復此問題

+0

然後,您可以將樣式容器ListBoxItem。 「listbox阻止我的元素繼承正確的屬性」 - 請你澄清/詳細說明這個聲明嗎? – ASh

+0

您也可以覆蓋系統顏色。當我想在全球範圍內做東西時,我真的很喜歡它。因爲您不再需要使用觸發器或擔心事件。您只需爲給定對象設置SystemColor,並將其「MouseOver」設置爲您想要的顏色。 [參考](https://blogs.msdn.microsoft.com/wpf/2010/11/30/systemcolors-reference/) –

回答

1

如果你想能夠選擇一個項目,你應該使用ListBox。 A ListBox是一個專門的ItemsControl,基本上增加了選擇項目的能力。外的箱子更有意義使用列表框與選擇支持

<ListBox x:Name="RelatedViewsICtl" ItemsSource="{Binding RelatedViews}" MouseDoubleClick="RelatedViewsLB_MouseDoubleClick"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Background" Value="Transparent" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBoxItem"> 
         <Border Name="border" VerticalAlignment="Stretch" Height="23" MinHeight="22" 
             Background="{TemplateBinding Background}"> 
          <ContentPresenter /> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Background" Value="#3E3E40" /> 
       </Trigger> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Background" Value="#007ACC" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal" HorizontalAlignment="Left"> 
       <TextBlock Text="" Margin="1"/> 
       <Image Source="Resources\Review.png"/> 
       <TextBlock Text="{Binding Path=Id}" Margin="1"/> 
       <TextBlock Text="-" Margin="1"/> 
       <TextBlock Text="{Binding Path=Name}" Margin="1" /> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel Orientation="Vertical"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
</ListBox> 
+0

這工作的背景,雖然我不得不調整邊界刪除它的畫筆。前景(文本的顏色)我必須手動設置。我看不到如何使它繼承正確的顏色。 – Noel

+0

@Noel:請記住投票贊成有用的答案:) – mm8

0

您應該明確地使用列表框,但默認的ListBoxItem模板的定義方式,它將結束騎任何你設定的背景值。這可能是您列表框問題的原因。解釋可以在this answer中找到。

簡而言之,任何設置爲ItemContainerStyle中ListBoxItem的背景屬性的內容都將不會使用,因爲默認模板觸發器會針對該模板中的特定邊框而不是控件本身的屬性。解決辦法是簡單地將覆蓋整個模板

您可以通過在XAML編輯器中輸入快速到達它,選擇它並轉到屬性選項卡。從那裏,在雜項 - >模板下,您可以選擇"Convert to a new resource"

相關問題