2017-05-24 239 views
-1

你好我已經使用了這個,發現了很多像我試圖完成的問題,但我無法得到它的工作。我已經建立了一個控件,其中有一個列表框,當我將鼠標放在該項目上或者選擇一個項目時,我想將列表項目的背景顏色更改爲顏色。Wpf自定義控件MouseOver和選擇

MyControl:

<ListBox x:Name="Appointments" 
     ItemsSource="{TemplateBinding ItemSource}" 
     DisplayMemberPath="{TemplateBinding DisplayMemberPath}" 
     SelectedValuePath="{TemplateBinding SelectedValuePath}"> 
    <ListBox.Resources> 
     <Style TargetType="{x:Type ListBoxItem}"> 

     </Style> 
    </ListBox.Resources> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 

      <Style.Triggers> 
       <DataTrigger Binding="{Binding AppointmentState}" 
                 Value="{x:Static enums:AppointmentState.Accepted}"> 
        <Setter Property="Background" 
                Value="Green" /> 
        <Setter Property="Foreground" 
                Value="White" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding AppointmentState}" 
                 Value="{x:Static enums:AppointmentState.Decliend}"> 
        <Setter Property="Background" 
                Value="Red" /> 
        <Setter Property="Foreground" 
                Value="White" /> 
       </DataTrigger> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Background" Value="Blue" /> 
       </Trigger> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Background" Value="{DynamicResource AccentColor}"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

我所試圖做下Listbox.ResorcesListBox.ItemContainerStyleListBox.DataTemplate的只是把。感謝您的幫助

編輯:新的控制

<Style TargetType="{x:Type local:MonthCalenderDay}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:MonthCalenderDay}"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}"> 
        <StackPanel> 
         <TextBlock x:Name="DayNumber" 
            FontSize="15" 
            Foreground="{DynamicResource AccentColorBrush}" 
            Text="{Binding DayNumber,RelativeSource={RelativeSource TemplatedParent}}"/> 
         <ListBox x:Name="Appointments" 
           ItemsSource="{TemplateBinding ItemSource}" 
           DisplayMemberPath="{TemplateBinding DisplayMemberPath}" 
           SelectedValuePath="{TemplateBinding SelectedValuePath}"> 
          <ListBox.Resources> 
           <Style TargetType="ListBoxItem"> 
            <Setter Property="Template"> 
             <Setter.Value> 
              <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
               <Border x:Name="border" 
                 BorderBrush="{TemplateBinding BorderBrush}" 
                 BorderThickness="{TemplateBinding BorderThickness}" 
                 Background="{TemplateBinding Background}" 
                 Padding="{TemplateBinding Padding}" 
                 SnapsToDevicePixels="true"> 
                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                     SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"                   
                     VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 

               </Border> 
               <ControlTemplate.Triggers> 
                <MultiTrigger> 
                 <MultiTrigger.Conditions> 
                  <Condition Property="IsMouseOver" 
                     Value="True" /> 
                 </MultiTrigger.Conditions> 
                 <Setter Property="Background" 
                   TargetName="border" 
                   Value="Blue" /> 
                </MultiTrigger> 
                <MultiTrigger> 
                 <MultiTrigger.Conditions> 
                  <Condition Property="Selector.IsSelectionActive" Value="False" /> 
                  <Condition Property="IsSelected" Value="True" /> 
                 </MultiTrigger.Conditions> 
                 <Setter Property="Background" 
                   TargetName="border" 
                   Value="{DynamicResource AccentColorBrush}" /> 
                 <Setter Property="BorderBrush" 
                   TargetName="border" 
                   Value="{StaticResource Item.SelectedInactive.Border}" /> 
                </MultiTrigger> 
                <MultiTrigger> 
                 <MultiTrigger.Conditions> 
                  <Condition Property="Selector.IsSelectionActive" 
                     Value="True" /> 
                  <Condition Property="IsSelected" 
                     Value="True" /> 
                 </MultiTrigger.Conditions> 
                 <Setter Property="Background" 
                   TargetName="border" 
                   Value="{DynamicResource AccentColorBrush}" /> 
                 <Setter Property="BorderBrush" 
                   TargetName="border" 
                   Value="{DynamicResource AccentColorBrush}" /> 
                </MultiTrigger> 
                <Trigger Property="IsEnabled" 
                  Value="False"> 
                 <Setter Property="TextElement.Foreground" 
                   TargetName="border" 
                   Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
                </Trigger> 
               </ControlTemplate.Triggers> 
              </ControlTemplate> 
             </Setter.Value> 
            </Setter> 
            <Style.Triggers> 
             <!--<DataTrigger Binding="{Binding AppointmentState}" 
                Value="{x:Static enums:AppointmentState.Accepted}"> 
              <Setter Property="Background" 
                Value="Green" /> 
              <Setter Property="Foreground" 
                Value="White" /> 
             </DataTrigger> 
             <DataTrigger Binding="{Binding AppointmentState}" 
                Value="{x:Static enums:AppointmentState.Decliend}"> 
              <Setter Property="Background" 
                Value="Red" /> 
              <Setter Property="Foreground" 
                Value="White" /> 
             </DataTrigger>--> 
            </Style.Triggers> 
           </Style> 
          </ListBox.Resources> 
         </ListBox> 
        </StackPanel> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

回答

1

您需要修改控件模板:

<ListBox x:Name="Appointments" 
    ItemsSource="{TemplateBinding ItemSource}" 
    DisplayMemberPath="{TemplateBinding DisplayMemberPath}" 
    SelectedValuePath="{TemplateBinding SelectedValuePath}"> 
    <ListBox.Resources> 
     <SolidColorBrush x:Key="Item.MouseOver.Background" Color="#1F26A0DA"/> 
     <SolidColorBrush x:Key="Item.MouseOver.Border" Color="#a826A0Da"/> 
     <SolidColorBrush x:Key="Item.SelectedInactive.Background" Color="#3DDADADA"/> 
     <SolidColorBrush x:Key="Item.SelectedInactive.Border" Color="#FFDADADA"/> 
     <SolidColorBrush x:Key="Item.SelectedActive.Background" Color="#3D26A0DA"/> 
     <SolidColorBrush x:Key="Item.SelectedActive.Border" Color="#FF26A0DA"/> 
    </ListBox.Resources> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
         <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true"> 
          <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
         </Border> 
         <ControlTemplate.Triggers> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="IsMouseOver" Value="True"/> 
           </MultiTrigger.Conditions> 
           <Setter Property="Background" TargetName="Bd" Value="Blue"/> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="Selector.IsSelectionActive" Value="False"/> 
            <Condition Property="IsSelected" Value="True"/> 
           </MultiTrigger.Conditions> 
           <Setter Property="Background" TargetName="Bd" Value="{DynamicResource AccentColor}"/> 
           <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedInactive.Border}"/> 
          </MultiTrigger> 
          <MultiTrigger> 
           <MultiTrigger.Conditions> 
            <Condition Property="Selector.IsSelectionActive" Value="True"/> 
            <Condition Property="IsSelected" Value="True"/> 
           </MultiTrigger.Conditions> 
           <Setter Property="Background" TargetName="Bd" Value="{DynamicResource AccentColor}"/> 
           <Setter Property="BorderBrush" TargetName="Bd" Value="{StaticResource Item.SelectedActive.Border}"/> 
          </MultiTrigger> 
          <Trigger Property="IsEnabled" Value="False"> 
           <Setter Property="TextElement.Foreground" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <!--<DataTrigger Binding="{Binding AppointmentState}" 
                 Value="{x:Static enums:AppointmentState.Accepted}"> 
          <Setter Property="Background" 
                Value="Green" /> 
          <Setter Property="Foreground" 
                Value="White" /> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding AppointmentState}" 
                 Value="{x:Static enums:AppointmentState.Decliend}"> 
          <Setter Property="Background" 
                Value="Red" /> 
          <Setter Property="Foreground" 
                Value="White" /> 
         </DataTrigger>--> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Background" Value="Blue" /> 
       </Trigger> 
       <Trigger Property="IsSelected" Value="True"> 
        <Setter Property="Background" Value="{DynamicResource AccentColor}"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 
+0

現在有展示的項目,但並懸停在工作,但心不是任何值 – JamTay317

+0

您仍然需要設置ItemsSource,DisplayMemberPath ...屬性。只需將模板設置器和資源添加到原始標記即可。 – mm8

+0

所有這些都在那裏,只是沒有值顯示想知道我是否缺少contentPresenter中的綁定? – JamTay317