2013-03-12 40 views
5

Tôi đang thực hiện một ứng dụng Addon cho Windows WPF. Vì vậy tôi có thể truy cập ListView với lập trình nhưng không chỉnh sửa nguồn WPF.Thay đổi có lập trình ListView Kiểu của bộ chọn

Để thêm định dạng đặc biệt cho ListViewItem s tùy thuộc vào dữ liệu tôi đã tạo lớp StyleSelector của riêng mình và gán một phiên bản của nó cho thuộc tính ListView ItemContainerStyleSelector.

Dưới đây là nguồn:

public class MySelector extends System.Windows.Controls.StyleSelector { 

    private var oldSelector : System.Windows.Controls.StyleSelector; 

    public function MySelector(oldSelector : StyleSelector, debug : Object) { 
     this.oldSelector = oldSelector; 
    } 
    public function SelectStyle(item : Object, container : DependencyObject) : Style { 
     if (this.oldSelector != null) { 
     var oldStyle : System.Windows.Style = this.oldSelector.SelectStyle(item, container); 
     if (item[3] == "3") { 
      var newStyle : System.Windows.Style = new System.Windows.Style(oldStyle.TargetType, oldStyle); 
      newStyle.Setters.Add(new Setter(Control.BackgroundProperty, System.Windows.Media.Brushes.Red)); 
      return newStyle; 
     } else { 
      return oldStyle; 
     } 
     } 
     return null; 
    } 
    } 

này có bộ chọn cũ và cho biết thêm một nền đỏ nếu cột chỉ số 3 chứa một giá trị tương đương với "3".

Điều này hoạt động tốt nhưng khi một hàng trong ListView bị lơ lửng hoặc được chọn vẫn là kiểu gốc áp dụng và nền đỏ bị mất cho đến khi dòng được bỏ chọn hoặc không được chỉnh sửa.

Làm cách nào để áp dụng nền màu đỏ cho các dòng đó ngay cả khi chúng được chọn hoặc được di chuột?

Hãy nhớ rằng, tôi không thể chỉnh sửa XAML nhưng truy cập theo chương trình hầu hết các thuộc tính. Trong trường hợp đây là addon-code được viết bằng JScript.NET.


bây giờ tôi đã cố gắng thêm trigger để newStyle với lập trình:

  var t1 : Trigger = new Trigger(); 
      t1.Property = ListBoxItem.IsSelectedProperty; 
      t1.Value = true; 
      t1.Setters.Add(new Setter(Control.BackgroundProperty, System.Windows.Media.Brushes.Black)); 
      newStyle.Triggers.Add(t1); 
      var t2 : Trigger = new Trigger(); 
      t2.Property = UIElement.IsMouseOverProperty; 
      t2.Value = true; 
      t2.Setters.Add(new Setter(Control.BackgroundProperty, System.Windows.Media.Brushes.Violet)); 
      newStyle.Triggers.Add(t2); 
      var t3 : Trigger = new Trigger(); 
      t3.Property = UIElement.IsFocusedProperty; 
      t3.Value = true; 
      t3.Setters.Add(new Setter(Control.BackgroundProperty, System.Windows.Media.Brushes.Yellow)); 
      newStyle.Triggers.Add(t3); 

Không có tác dụng.

+0

Bạn có thể nhìn vào bộ sưu tập trigger trên phong cách mới của bạn và loại bỏ các mouseover và di chuột gây nên? 'newStyle.Triggers' –

+0

Thật không may oldStyle và newStyle cả hai đều không có bất kỳ trình kích hoạt nào. Có thể họ đến từ một chủ đề? @BrentStewart – ZoolWay

+0

Các hiệu ứng di chuột và chọn lựa này có thể được xác định bên trong mẫu mục (đó là DataTemplate). Trước tiên, bạn cần phải điều tra và tìm ra nơi kích hoạt được đặt. Bạn có thể sử dụng, ví dụ, ILSpy, để dịch ngược mã xaml từ mã nhị phân – Woodman

Trả lời

3

Tôi sẽ sử dụng thư viện tài nguyên và thao tác các trình kích hoạt, v.v. ở đó.

Get Started

Ví dụ:

<Style x:Key="MenuButtonStyle" TargetType="Button"> 
    <Setter Property="Background" Value="#FF494646"/> 
    <Setter Property="Foreground" Value="#FFE5E5E5"/> 
    <Setter Property="TextOptions.TextFormattingMode" Value="Display"></Setter> 
    <Setter Property="Cursor" Value="Hand"></Setter> 
    <Setter Property="Effect"> 
     <Setter.Value> 
      <DropShadowEffect Opacity="0.7"/> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Foreground" Value="Black"/> 
     </Trigger> 
     <Trigger Property="IsFocused" Value="True"> 
      <Setter Property="Background" Value="ForestGreen"></Setter> 
      <Setter Property="Foreground" Value="Black"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
+0

Thật không may tôi không thể thêm hoặc sửa đổi XAML nhưng đã cố gắng làm như vậy với lập trình, xem câu hỏi được cập nhật. Nhưng nó không hoạt động. – ZoolWay

+0

Điều này có thể là một nhận xét rất vô ích nếu tôi xin lỗi, nhưng bạn có thể không truy cập được do những hạn chế và vấn đề hiện tại của bạn không? –

+0

Có bởi vì mã của tôi là sản phẩm "addon" và thông qua các giao diện tôi nhận được danh sách nhưng không thể thay đổi XAML đã biên dịch. – ZoolWay

3
+0

Xin lỗi nhưng tôi đã sử dụng 'ItemContainerStyleSelector' làm câu hỏi. Vấn đề là, tôi có thể ảnh hưởng đến phong cách cho các hàng * bình thường * nhưng không ảnh hưởng đến các hàng được di chuyển hoặc được chọn. – ZoolWay

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