2014-09-25 2 views
0

Можно ли адресовать элементы, созданные с помощью ControlTemplate, которые не имеют имени в stlye?Практическое руководство. Доступ к элементам управления ControlTemplate, которые не имеют имени в стиле

Ниже приводится выдержка из шаблона управления по умолчанию в виде МОФ комбобокса:

<?xml version="1.0" encoding="utf-8"?> 
<ControlTemplate TargetType="ComboBox" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:mwt="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid Name="MainGrid" SnapsToDevicePixels="True"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*" /> 
     <ColumnDefinition Width="0" MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" /> 
    </Grid.ColumnDefinitions> 
    <Popup IsOpen="False" Placement="Bottom" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" AllowsTransparency="True" Name="PART_Popup" Margin="1,1,1,1" Grid.ColumnSpan="2"> 
    </Popup> 
    <ToggleButton IsChecked="False" BorderBrush="{TemplateBinding Border.BorderBrush}" Background="{TemplateBinding Panel.Background}" Grid.ColumnSpan="2"> 
    </ToggleButton> 
    <ContentPresenter Content="{TemplateBinding ComboBox.SelectionBoxItem}" ContentTemplate="{TemplateBinding ComboBox.SelectionBoxItemTemplate}" ContentStringFormat="{TemplateBinding ComboBox.SelectionBoxItemStringFormat}" Margin="{TemplateBinding Control.Padding}" HorizontalAlignment="{TemplateBinding Control.HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding Control.VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding UIElement.SnapsToDevicePixels}" IsHitTestVisible="False" /> 
    </Grid> 
</ControlTemplate> 

Теперь то, что я хочу сделать, это изменить IsHitTestVisible свойства ContentPresenter (который не имеет имени в ControlTemplate) до истины, например:

<ComboBox> 
    <ComboBox.Resources> 
     <Style TargetType="{x:Type ContentPresenter}" > 
      <Setter Property="IsHitTestVisible" Value="True" /> 
     </Style> 
    </ComboBox.Resources> 
</ComboBox> 

К сожалению, это не работает. Возможно ли это?

Если нет, это может быть сделано с помощью кода?

ответ

1

Ну, IsHitTestVisible устанавливается локально. Поэтому, чтобы переопределить это, нам нужно установить его локально (просто выполнимо в codebehind). Мы также можем установить его значение, используя источник более высокой точности, такой как анимация. Здесь вы можете определить стиль, ориентированный на ContentPresenter. В этом стиле определяют EventTrigger для Loaded события и использовать BooleanAnimationUsingKeyFrames с DiscreteBooleanKeyFrame, как это:

<ComboBox> 
    <ComboBox.Resources> 
    <Style TargetType="{x:Type ContentPresenter}"> 
     <Style.Triggers> 
      <EventTrigger RoutedEvent="Loaded"> 
      <BeginStoryboard> 
       <Storyboard Storyboard.TargetProperty="IsHitTestVisible"> 
        <BooleanAnimationUsingKeyFrames> 
        <DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:0"/> 
        </BooleanAnimationUsingKeyFrames>  
       </Storyboard> 
      </BeginStoryboard> 
      </EventTrigger> 
     </Style.Triggers> 
    </Style> 
    </ComboBox.Resources> 
</ComboBox> 

Подробнее о Dependency Property Value Precedence.

Смежные вопросы