AvalonDock:聚焦时改变标题背景

时间:2016-10-26 07:30:43

标签: wpf avalondock

如果窗格是焦点,我想更改窗格标题的背景。

试过这个:

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

应用了绿色背景,但如果我在窗格中选择了一个控件,则不会显示红色。 特殊副作用:如果我取消固定窗格,标题的背景将设置为默认值。如果我固定它,它会设置为绿色。

如何在焦点上改变它?

1 个答案:

答案 0 :(得分:3)

您当前的解决方案有两个问题。

样式化AnchorablePaneTitle仅在窗格停靠在DockingManager时才有效。只要取消停靠窗格,就不再有AnchorablePaneTitle,因为AvalonDock会将根元素更改为LayoutFloatingWindowControl,它具有不同的结构。

第二个问题是您正在使用IsFocused属性。这不会起作用,因为AnchorablePaneTitle根本无法集中注意力(默认情况下它只是TextBlock。)

要使其发挥作用,您必须使用DataTemplate的{​​{1}}属性为标题创建AnchorableTitleTemplate

以下是一个例子:

DockingManager

这里我创建了两个数据触发器,它们根据可锚定当前所处的模式对不同的属性做出反应:停靠或未停靠。

对于停靠状态,我使用<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的{​​{1}}属性(源自IsActive),但对于所有浮动窗口,它始终为xcad:LayoutFloatingWindowControl。也许这是因为它们都有一个Window(主窗口)。所以我决定使用true,它非常适合浮动窗口。