none
TreeViewのLostForcus時の選択色の指定方法 RRS feed

  • 質問

  • TreeViewのノードにTreeViewItemを継承して、スタックパネルにアイコンとテキストを表示するクラスを使用しております。
    ノード選択時に別のコントロールにForcusが移った際に、ノード選択色をそのままの表示色にしたいのですが、
    どのように行えばよいのでしょうか?


    以下のコードがTreeViewにAddを行っているクラスです。

        public class TreeViewItemList: TreeViewItem
        {
            #region Global variables
    
    ImageSource iconSource; TextBlock textBlock; Image icon; #endregion Global variables #region Constructors and Destructors public TreeViewItemList() { StackPanel stack = new StackPanel(); stack.Orientation = Orientation.Horizontal; Header = stack; icon = new Image(); icon.VerticalAlignment = VerticalAlignment.Center; icon.Margin = new Thickness(0, 0, 4, 0); icon.Source = iconSource; icon.Height = this.FontSize * 2; stack.Children.Add(icon); textBlock = new TextBlock(); textBlock.VerticalAlignment = VerticalAlignment.Center; textBlock.MinWidth = 50; stack.Children.Add(textBlock); stack.Height = this.FontSize * 3; } #endregion Constructors and Destructors #region Properties /// <summary> /// Gets/Sets the Selected Image for a TreeViewNode /// </summary> public ImageSource Icon { set { iconSource = value; icon.Source = iconSource; } get { return iconSource; } } #endregion Properties #region Event Handlers /// <summary> /// Event Handler on UnSelected Event /// </summary> /// <param name="args">Eventargs</param> protected override void OnUnselected(RoutedEventArgs args) { base.OnUnselected(args); icon.Source = iconSource; } /// <summary> /// Event Handler on Selected Event /// </summary> /// <param name="args">Eventargs</param> protected override void OnSelected(RoutedEventArgs args) { base.OnSelected(args); icon.Source = iconSource; } /// <summary> /// Gets/Sets the HeaderText of TreeViewWithIcons /// </summary> public string HeaderText { set { textBlock.Text = value; } get { return textBlock.Text; } } #endregion Event Handlers
    2009年5月13日 10:54

回答

  • 恐らくTreeViewItemのTemplateを差し替えないといけないです。

    TreeViewItemのControlTemplateの例は以下のURLにあります。
    http://msdn.microsoft.com/ja-jp/library/ms788727(VS.80).aspx

    このURLにあるTreeViewItemのスタイルのTriggerで選択中だけどアクティブではない時の
    色指定がされています。

    <MultiTrigger>
    	<MultiTrigger.Conditions>
    	  <Condition Property="IsSelected"
    	         Value="true"/>
    	  <Condition Property="IsSelectionActive"
    	         Value="false"/>
    	</MultiTrigger.Conditions>
    	<Setter TargetName="Bd"
    	    Property="Background"
    	    Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
    	<Setter Property="Foreground"
    	    Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    </MultiTrigger>
    

    このMultiTriggerのSetterの2つを以下のものに置き換えます。

    <Setter TargetName="Bd" Property="Background"
        Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
    <Setter Property="Foreground" 
        Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
    

    これで恐らく、フォーカスが外れても色が変わらなくなります。
    かずき Blog:http://blogs.wankuma.com/kazuki/
    • 回答としてマーク Hara_Hokuto 2009年5月14日 5:48
    2009年5月14日 3:55

すべての返信

  • 恐らくTreeViewItemのTemplateを差し替えないといけないです。

    TreeViewItemのControlTemplateの例は以下のURLにあります。
    http://msdn.microsoft.com/ja-jp/library/ms788727(VS.80).aspx

    このURLにあるTreeViewItemのスタイルのTriggerで選択中だけどアクティブではない時の
    色指定がされています。

    <MultiTrigger>
    	<MultiTrigger.Conditions>
    	  <Condition Property="IsSelected"
    	         Value="true"/>
    	  <Condition Property="IsSelectionActive"
    	         Value="false"/>
    	</MultiTrigger.Conditions>
    	<Setter TargetName="Bd"
    	    Property="Background"
    	    Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
    	<Setter Property="Foreground"
    	    Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    </MultiTrigger>
    

    このMultiTriggerのSetterの2つを以下のものに置き換えます。

    <Setter TargetName="Bd" Property="Background"
        Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
    <Setter Property="Foreground" 
        Value="{DynamicResource {x:Static SystemColors.HighlightTextBrushKey}}"/>
    

    これで恐らく、フォーカスが外れても色が変わらなくなります。
    かずき Blog:http://blogs.wankuma.com/kazuki/
    • 回答としてマーク Hara_Hokuto 2009年5月14日 5:48
    2009年5月14日 3:55
  • 回答ありがとうございます。

    使わせていただきます。
    2009年5月14日 9:25