使用Style样式嵌入ControlTemplate

时间:2016-03-03 17:48:48

标签: wpf wpf-controls infragistics wpf-style

我使用Infragistics控件和Theming。 Template属性在Trigger上设置。

该模板在层次结构中进一步配置,因此我无法直接编辑,但我想更改其中一个属性集。

e.g。

在触发器上设置模板(截断)

<Style x:Key="FxtPaneTabItemStyle" TargetType="{x:Type igDock:PaneTabItem}">
  <Setter Property="TextBlock.TextTrimming" Value="CharacterEllipsis" />
    <Style.Triggers>
      <Trigger Property="igDock:XamDockManager.PaneLocation" Value="Unpinned">
        <Setter Property="Template" Value="{DynamicResource {x:Static igDock:PaneTabItem.DockableTabItemTemplateKey}}" />
      </Trigger>
  </Style.Triggers>
</Style>

在无法访问的代码中配置的模板(截断)

<ControlTemplate x:Key="{x:Static igDock:PaneTabItem.DockableTabItemTemplateKey}" TargetType="{x:Type igDock:PaneTabItem}">
 <Border x:Name="ctrlBorder" SnapsToDevicePixels="true" MinHeight="25">
  <controls:CardPanel>
  <controls:CardPanel x:Name="Background">
   <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto" Height="25">
    <Border x:Name="Border" Margin="0,0,0,0" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" SnapsToDevicePixels="True"/>
    <Border x:Name="HighlightBorder" Margin="0" BorderBrush="{DynamicResource {x:Static igDock:DockManagerBrushKeys.TabbedListNotActiveInnerBorderFillKey}}" BorderThickness="0" SnapsToDevicePixels="True"/>
   </Grid>
  </controls:CardPanel>
 </Border>
<ControlTemplate.Triggers>
</ControlTemplate.Triggers>

我只想覆盖Border(x:Name =&#34; ctrlBorder&#34;)MinHeight属性。如果不在我的代码库中复制整个ControlTemplate,这是否可行。并改变这个单一的财产?

1 个答案:

答案 0 :(得分:0)

据我所知,您无法更改模板,但您可以在使用该控件的代码上创建自定义行为(或在代码后面添加代码)。

在该代码上,遍历控件可视层次结构并按名称查找边框。你可以改变它的属性。

加载事件符合该对象之后,您将尝试在可视树上找到元素(您的案例边框),这一点非常重要,因为您需要已经创建视觉

在视觉层次结构中查找视觉元素:

        public static List<T> FindVisualChildren<T>(DependencyObject depObj, bool searchWithinAFoundT = true) where T : DependencyObject
        {
            List<T> list = new List<T>();
            if (depObj != null)
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                    if (child != null && child is T)
                    {
                        list.Add((T)child);

                        // this means that an element is not expected to contain elements of his type
                        if (!searchWithinAFoundT) { continue; }
                    }

                    List<T> childItems = FindVisualChildren<T>(child, searchWithinAFoundT);
                    if (childItems != null && childItems.Count > 0)
                    {
                        foreach (var item in childItems)
                        {
                            list.Add(item);
                        }
                    }
                }
            }
            return list;
        }

它有点脏,但它对特定情况有帮助