AvalonDock:聚焦时更改标题背景
AvalonDock: Change background of title when focused
如果窗格获得焦点,我想更改窗格标题的背景。
所以尝试了这个:
<Style TargetType="xcad:AnchorablePaneTitle">
<Setter Property="Background" Value="Green" />
<Style.Triggers>
<Trigger Property="IsFocused" Value="true">
<Setter Property="Background" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
应用绿色背景,但如果我 select 窗格中的控件,则不会显示红色。
特殊的副作用:如果我取消固定窗格,标题的背景将设置为默认值。如果我固定它,它会设置为绿色。
如何改变焦点?
您当前的解决方案存在两个问题。
仅当窗格停靠到 DockingManager
时,AnchorablePaneTitle
的样式才有效。一旦您取消停靠窗格,就不再有 AnchorablePaneTitle
,因为 AvalonDock 将根元素更改为具有不同结构的 LayoutFloatingWindowControl
。
第二个问题是您使用的是 IsFocused
属性。这是行不通的,因为 AnchorablePaneTitle
根本无法聚焦(默认情况下它只是一个 TextBlock
)。
要完成这项工作,您必须使用 DockingManager
的 AnchorableTitleTemplate
属性 为标题创建 DataTemplate
。
这是一个例子:
<xcad:DockingManager.AnchorableTitleTemplate>
<DataTemplate>
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding Model.IsActive, Mode=OneWay,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type xcad:LayoutAnchorableControl}},
FallbackValue=False}" Value="True">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsKeyboardFocusWithin, Mode=OneWay,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type xcad:LayoutFloatingWindowControl}},
FallbackValue=False}" Value="True">
<Setter Property="Background" Value="Blue"/>
</DataTrigger>
</Style.Triggers>
<Setter Property="Background" Value="Green"/>
</Style>
</Grid.Style>
<TextBlock Foreground="White" FontWeight="Bold" Text="{Binding Title}" />
</Grid>
</DataTemplate>
</xcad:DockingManager.AnchorableTitleTemplate>
这里我创建了两个数据触发器,它们根据锚点当前所处的模式对不同的属性做出反应:停靠或未停靠。
对于停靠状态,我使用 Model.IsActive
属性,效果很好。
对于未停靠(浮动)状态,我首先尝试了 xcad:LayoutFloatingWindowControl
的 IsActive
属性(派生自 Window
),但它始终是 true
全部浮动 windows。也许这是因为它们都有一个 Owner
(主要的 window)。所以我决定使用 IsKeyboardFocusWithin
,它非常适合浮动 windows.
如果窗格获得焦点,我想更改窗格标题的背景。
所以尝试了这个:
<Style TargetType="xcad:AnchorablePaneTitle">
<Setter Property="Background" Value="Green" />
<Style.Triggers>
<Trigger Property="IsFocused" Value="true">
<Setter Property="Background" Value="Red" />
</Trigger>
</Style.Triggers>
</Style>
应用绿色背景,但如果我 select 窗格中的控件,则不会显示红色。 特殊的副作用:如果我取消固定窗格,标题的背景将设置为默认值。如果我固定它,它会设置为绿色。
如何改变焦点?
您当前的解决方案存在两个问题。
仅当窗格停靠到 DockingManager
时,AnchorablePaneTitle
的样式才有效。一旦您取消停靠窗格,就不再有 AnchorablePaneTitle
,因为 AvalonDock 将根元素更改为具有不同结构的 LayoutFloatingWindowControl
。
第二个问题是您使用的是 IsFocused
属性。这是行不通的,因为 AnchorablePaneTitle
根本无法聚焦(默认情况下它只是一个 TextBlock
)。
要完成这项工作,您必须使用 DockingManager
的 AnchorableTitleTemplate
属性 为标题创建 DataTemplate
。
这是一个例子:
<xcad:DockingManager.AnchorableTitleTemplate>
<DataTemplate>
<Grid>
<Grid.Style>
<Style TargetType="Grid">
<Style.Triggers>
<DataTrigger Binding="{Binding Model.IsActive, Mode=OneWay,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type xcad:LayoutAnchorableControl}},
FallbackValue=False}" Value="True">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsKeyboardFocusWithin, Mode=OneWay,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type xcad:LayoutFloatingWindowControl}},
FallbackValue=False}" Value="True">
<Setter Property="Background" Value="Blue"/>
</DataTrigger>
</Style.Triggers>
<Setter Property="Background" Value="Green"/>
</Style>
</Grid.Style>
<TextBlock Foreground="White" FontWeight="Bold" Text="{Binding Title}" />
</Grid>
</DataTemplate>
</xcad:DockingManager.AnchorableTitleTemplate>
这里我创建了两个数据触发器,它们根据锚点当前所处的模式对不同的属性做出反应:停靠或未停靠。
对于停靠状态,我使用 Model.IsActive
属性,效果很好。
对于未停靠(浮动)状态,我首先尝试了 xcad:LayoutFloatingWindowControl
的 IsActive
属性(派生自 Window
),但它始终是 true
全部浮动 windows。也许这是因为它们都有一个 Owner
(主要的 window)。所以我决定使用 IsKeyboardFocusWithin
,它非常适合浮动 windows.