2013-02-12 32 views
12

Tôi cố gắng để tái tạo giao diện người dùng Mail từ Windows 8 trong một ứng dụng WPF chạy trên Windows 7. Dưới đây là những gì tôi muốn đạt được:Làm thế nào để thiết lập một màu sắc danh sách lựa chọn WPF?

Target UI

Đặc biệt, tôi không biết làm thế nào để thay đổi màu nền cho các mục được chọn ví dụ mục Hộp thư đến trong cột đầu tiên và thư từ Twitter trong cột thứ hai. Tôi đã thử một số giải pháp từ khác Stackoverflow câu hỏi tương tự nhưng không ai có vẻ làm việc cho tôi. ví dụ.

Selected item loses style when focus moved out in WPF ListBox

WPF ListView Inactive Selection Color

Đây là mã tôi đã cho listview của tôi:

<ListView Grid.Row="0" SelectedItem="{Binding Path=SelectedArea}" ItemsSource="{Binding Path=Areas}" Background="#DCE3E5" > 

        <ListView.Resources> 

         <!-- Template that is used upon selection of an Area --> 
         <ControlTemplate x:Key="SelectedTemplate" TargetType="ListViewItem"> 
          <Border Background="#388095" Cursor="Hand" > 
           <TextBlock Text="{Binding Name}" Margin="5" /> 
          </Border>         
         </ControlTemplate> 

         <Style TargetType="ListViewItem"> 
          <Setter Property="Template"> 
           <Setter.Value>           
            <!-- Base Template that is replaced upon selection --> 
            <ControlTemplate TargetType="ListViewItem"> 
             <Border Background="#DCE3E5" Cursor="Hand" > 
              <TextBlock Text="{Binding Name}" Margin="5" /> 
             </Border> 
            </ControlTemplate> 
           </Setter.Value> 
          </Setter> 
          <Style.Triggers> 
           <MultiTrigger> 
            <MultiTrigger.Conditions> 
             <Condition Property="IsSelected" Value="true" /> 
            </MultiTrigger.Conditions> 
            <Setter Property="Template" Value="{StaticResource SelectedTemplate}" /> 
           </MultiTrigger> 
          </Style.Triggers> 
         </Style> 

        </ListView.Resources>       

       </ListView> 

Làm thế nào tôi có thể thay đổi màu nền của mục đã chọn? Và làm cách nào để giữ lại thay đổi màu khi tiêu điểm thay đổi.

Trả lời

14

tôi đã làm một cái gì đó tương tự như sau đây:

<ListView.Resources>     
    <ControlTemplate x:Key="SelectedTemplate" TargetType="ListViewItem"> 
     <Border CornerRadius="5" BorderThickness="1" BorderBrush="DarkGray" Background="#FF92C6F9" Padding="2" HorizontalAlignment="Left" Margin="5" Tag="{Binding Value}" Cursor="Hand" MouseUp="Border_MouseUp_1">       
      <TextBlock Text="{Binding Name}" Margin="5" /> 
     </Border> 
    </ControlTemplate> 
    <Style TargetType="ListViewItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="ListViewItem"> 
        <Border CornerRadius="5" BorderThickness="1" BorderBrush="DarkGray" Background="WhiteSmoke" Padding="2" HorizontalAlignment="Left" Margin="5" Tag="{Binding Value}" Cursor="Hand" MouseUp="Border_MouseUp_1" >          
         <TextBlock Text="{Binding Name}" Margin="5" /> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <MultiTrigger> 
       <MultiTrigger.Conditions> 
        <Condition Property="IsSelected" Value="true" /> 
        <Condition Property="Selector.IsSelectionActive" Value="true" /> 
       </MultiTrigger.Conditions>        
       <Setter Property="Template" Value="{StaticResource SelectedTemplate}" />        
      </MultiTrigger> 
     </Style.Triggers> 
    </Style> 
</ListView.Resources> 

Tôi tin rằng loại bỏ:

<Condition Property="Selector.IsSelectionActive" Value="true" /> 

sẽ cho phép bạn để giữ cho màu nền sau khi tập trung sẽ bị mất.

EDIT:

Trả lời câu hỏi của bạn dưới đây:

Bạn có thể liên kết các tài sản tag của TextBlock tới tham số lệnh, và sau đó thực hiện lệnh trên các sự kiện MouseUp của TextBlock:

<TextBlock x:Name="MyTextBlock" Text="Click Me!" Tag="{Binding MyCommandParameter}" MouseUp="MyTextBlock_MouseUp" /> 

Và trong các mã sau:

private void MyTextBlock_MouseUp(object sender, MouseButtonEventArgs e) 
    { 
     TextBlock tb = sender as TextBlock; 

     if (tb != null && tb.Tag != null) 
     { 
      ViewModel.MyCommand.Execute(tb.Tag); 
     }    
    } 
+0

Cảm ơn @TrueEddie. Máy của tôi đang hoạt động và tôi không thể kiểm tra giải pháp của bạn. Tôi sẽ quay lại ngay sau khi tôi có thể sửa máy của tôi. – Yasir

+0

Điều này cho biết lựa chọn đúng cách. Nhưng bây giờ chúng ta đang sử dụng TextBlock thay vì siêu liên kết mà tôi đang sử dụng, tôi không thể cung cấp Lệnh mà tôi cần gọi nữa. Làm thế nào tôi có thể cung cấp lệnh và tham số liên quan? Khi tôi thay thế phần tử Border của bạn bằng siêu liên kết, nó cho phép tôi thay đổi màu sắc khi được nhấp bên ngoài siêu liên kết nhưng không cho phép tôi gọi lệnh. Khi tôi nhấp vào siêu liên kết, nó cho phép tôi inovke lệnh nhưng màu sắc không thay đổi. – Yasir

+0

Tôi đã chỉnh sửa câu trả lời ở trên. – TrueEddie

7

Chỉ cần thêm vào điểm "TrueEddie".

Tùy chọn khác sẽ là "ItemContainerStyle" trong ListView.

<ListView Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" 


        BorderThickness="0" 
        ItemContainerStyle="{StaticResource ListViewSmartNotes}" 
        SelectedItem="{Binding SelectedSmartNotes, Mode=TwoWay}" 
        ItemsSource="{Binding LstSmartNotes, Mode=TwoWay}" 
        ItemTemplate="{DynamicResource ListViewItemOptionStyle}"> 


     </ListView> 

ListViewItemOptionStyle quy định tại Style.xml

<Style x:Key="ListViewItemOptionStyle" TargetType="ListViewItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <!-- Trun off default selection--> 
       <ControlTemplate TargetType="{x:Type ListViewItem}"> 
        <Border x:Name="Bd" BorderBrush="Gray" BorderThickness="0,1,0,1" 
          Background="{TemplateBinding Background}" 
          Padding="{TemplateBinding Padding}" 
          SnapsToDevicePixels="true"> 
         <ContentPresenter 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
        </Border> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Foreground" 
            Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
     </Setter.Value> 
     </Setter> 
    <Style.Triggers> 
     <MultiTrigger> 
      <MultiTrigger.Conditions> 
       <Condition Property="IsSelected" Value="True" /> 
      </MultiTrigger.Conditions> 
      <MultiTrigger.Setters> 
       <Setter Property="Background" Value="Green" /> 
       <Setter Property="BorderBrush" Value="Green" /> 
       <Setter Property="Foreground" Value="White"/> 
      </MultiTrigger.Setters> 
     </MultiTrigger> 
    </Style.Triggers> 
</Style> 

Để biết thêm chi tiết

https://sites.google.com/site/greateindiaclub/mobil-apps/windows8/wpfimportantbindings

+4

Tôi tin rằng các liên kết ** ItemContainerStyle ** và ** ItemTemplate ** của bạn được đảo ngược và nên đọc 'ItemContainerStyle =" {StaticResource ListViewItemOptionStyle} "', nếu không bạn sẽ nhận được một chuyển đổi ngoại lệ. Ngoài ra, nó có thể chỉ là tôi, tôi khuyên bạn nên sử dụng '' hơn bằng cách sử dụng '', nếu có nhiều cột liên quan. – famousKaneis

Các vấn đề liên quan