2013-03-12 14 views
5

Windows WPFアプリケーションにAddonを実行しています。したがって、私はプログラミングでListViewにアクセスできますが、WPFソースは編集できません。ListViewのセレクタをプログラムで変更する

データに応じてListViewItemの特殊な書式を追加するには、自分自身のStyleSelectorクラスを作成し、そのインスタンスをListView ItemContainerStyleSelectorプロパティに割り当てました。ここ

ソースである:

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; 
    } 
    } 

これは、古いセレクタを受け取り、列インデックス3は"3"に等しい値が含まれている場合に赤色の背景を追加します。

これはうまくいきますが、ListViewの行が表示されたり選択されたりしても、元のスタイルが適用され、線が選択されていない、または表示されなくなるまで赤い背景が失われます。

赤い背景を選択した場合でも、その線に赤い背景を適用するにはどうすればよいですか?

XAMLを編集することはできませんが、プログラムではほとんどのプロパティにアクセスできます。これは、JScript.NETで書かれたアドオンコードです。


私は今、プログラミングをnewStyleにトリガを追加しようとしましたなかった:

  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); 

ませ効果を。

+0

、あなたの新しいスタイルでのトリガーのコレクションを見て、マウスオーバーを削除して、トリガーを置くことはできますか? 'newStyle.Triggers' –

+0

残念ながら、oldStyleとnewStyleにはいずれもトリガーがありません。彼らはテーマから来ることができますか? @BrentStewart – ZoolWay

+0

これらのマウスのホバーと選択効果は、アイテムテンプレート(DataTemplate)内で定義できます。最初に、トリガーがどこにあるかを調べて調べる必要があります。たとえば、ILSpyを使用して、バイナリのxamlコードを逆コンパイルすることができます – Woodman

答えて

3

私はリソースライブラリを使用し、そこにトリガなどを操作します。

Get Started

例:

<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

残念ながら、私はXAMLを追加または変更することはできませんが、プログラミングでそれを試みました。更新された質問を参照してください。しかし、それは動作しませんでした。 – ZoolWay

+0

これは私がお詫びしますと、非常に役に立たないコメントかもしれませんが、あなたの現在の制限と問題のためアクセスできないのですか? –

+0

はい、私のコードは「アドオン」製品であり、インターフェースを介してリストを取得できますが、コンパイルされたXAMLは変更できません。 – ZoolWay

3
+0

申し訳ありませんが、質問には既に 'ItemContainerStyleSelector'が使用されています。問題は、*通常の*行のスタイルに影響を与えることができますが、ホバリングされた行や選択された行のスタイルには影響しません。 – ZoolWay

関連する問題