1

我将 Infragistics 控件与 Theming 一起使用。模板属性在触发器上设置。

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

例如

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

<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="ctrlBorder") MinHeight 属性。如果不复制我的代码库中的整个 ControlTemplate,这是否可能。并改变这个单一的属性?

4

1 回答 1

0

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

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

重要的是,在Loaded事件与该对象一致之后,您将尝试在视觉树上找到元素(案例的边框) ,因为您需要已经创建视觉对象

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

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

它有点脏,但它可以在特定情况下提供帮助

于 2016-11-15T17:57:17.357 回答