我使用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,这是否可行。并改变这个单一的财产?
答案 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;
}
它有点脏,但它对特定情况有帮助