2010-10-14 2 views
3

Я пытаюсь получить ComboBox в соответствии с визуальным дизайном, поэтому его ToggleButton имеет синюю рамку, если у фокуса ComboBox. Я не могу понять, как это сделать, и не могу найти пример.WPF ComboBox: как установить фокус на это togglebutton

Когда фокус ComboBox получает фокус, внутри внутри находится пунктирный фокус. Как передать состояние фокусана ToggleButton, так что включен синий стиль рамки?

Вот мой ComboBox шаблон:

<ControlTemplate x:Key="ComboBoxCT" TargetType="{x:Type ComboBox}"> 
    <Grid x:Name="gLayoutRoot" 
     Margin="{TemplateBinding Margin}" 
     HorizontalAlignment="{TemplateBinding HorizontalAlignment}" 
     VerticalAlignment="{TemplateBinding VerticalAlignment}" 
     MinWidth="{TemplateBinding MinWidth}" 
     MinHeight="{TemplateBinding MinHeight}" 
     MaxWidth="{TemplateBinding MaxWidth}" 
     MaxHeight="{TemplateBinding MaxHeight}" 
     SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"> 
     <ToggleButton x:Name="ToggleButton" 
      Grid.Column="2" 
      Focusable="false" 
      IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" 
      ClickMode="Press" 
      Style="{DynamicResource ComboBoxToggleStyle}" 
      /> 
     <AccessText x:Name="ContentSite" 
      Style="{StaticResource ComboBoxAccessTextStyle}" 
      Text="{TemplateBinding SelectionBoxItem}" 
      Foreground="{TemplateBinding Foreground}"/> 
     <TextBox x:Name="PART_EditableTextBox" 
      Style="{x:Null}" 
      HorizontalAlignment="{TemplateBinding HorizontalAlignment}" 
      VerticalAlignment="{TemplateBinding VerticalAlignment}" 
      Margin="2,3,17,2" 
      Focusable="True" 
      Background="{DynamicResource InnerBgLight}" 
      Visibility="Hidden" 
      IsReadOnly="{TemplateBinding IsReadOnly}"> 
      <TextBox.Template> 
       <ControlTemplate TargetType="TextBox"> 
        <Border x:Name="PART_ContentHost" Focusable="False" Background="{TemplateBinding Background}" /> 
       </ControlTemplate> 
      </TextBox.Template> 
     </TextBox> 
     <Popup x:Name="Popup" 
      Placement="Bottom" 
      IsOpen="{TemplateBinding IsDropDownOpen}" 
      AllowsTransparency="True" 
      Focusable="False" 
      PopupAnimation="Slide"> 
       <Grid x:Name="DropDown" 
        SnapsToDevicePixels="True"     
        MinWidth="{TemplateBinding ActualWidth}" 
        MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
         <Border x:Name="OuterBorder" 
          Style="{DynamicResource OuterBorderBottomRestStyle}" 
          Background="{DynamicResource InnerBorder}"> 
          <Border x:Name="InnerBorder" 
           Style="{DynamicResource InnerBottomBorderStyle}"> 
           <ScrollViewer x:Name="scvCbxItems" SnapsToDevicePixels="True"> 
            <StackPanel x:Name="spCbxItemsPanel" IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" /> 
           </ScrollViewer> 
          </Border> 
         </Border> 
       </Grid> 
      </Popup> 
     </Grid> 
     <ControlTemplate.Triggers> 
      <Trigger Property="HasItems" Value="false"> 
       <Setter TargetName="InnerBorder" Property="MinHeight" Value="95"/> 
      </Trigger> 
      <Trigger Property="IsGrouping" Value="true"> 
       <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
      </Trigger> 
      <Trigger Property="IsEditable" Value="true"> 
       <Setter Property="IsTabStop" Value="false"/> 
       <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible"/> 
       <Setter TargetName="ContentSite" Property="Visibility" Value="Hidden"/> 
      </Trigger> 
      <Trigger Property="IsEnabled" Value="false"> 
       <Setter Property="Foreground" Value="{DynamicResource FgDisabledBrush}"/> 
       <Setter Property="OpacityMask" TargetName="OuterBorder" Value="{DynamicResource OuterBgDisabledOpacityMask}"/> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 

А вот мой ToggleButton шаблон:

<ControlTemplate x:Key="ComboBoxToggleCT" TargetType="{x:Type ToggleButton}"> 
    <Border x:Name="OuterBorder" 
     Style="{DynamicResource OuterBorderTopRestStyle}"> 
     <Border x:Name="InnerBorder" 
      Style="{DynamicResource InnerTopBorderStyle}"> 
       <Path x:Name="Arrow" 
        HorizontalAlignment="Right" VerticalAlignment="Center" 
        Margin="5" 
        Fill="{DynamicResource FgBrush}" 
        Data="{DynamicResource DownArrowGeometry}"/> 
     </Border> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Style" TargetName="OuterBorder" Value="{DynamicResource OuterBorderTopSelectStyle}"/> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="OpacityMask" TargetName="OuterBorder" Value="{DynamicResource OuterBgDisabledOpacityMask}"/> 
      <Setter Property="Fill" TargetName="Arrow" Value="{DynamicResource FgDisabledBrush}"/> 
     </Trigger> 
     <Trigger Property="IsPressed" Value="True"> 
      <Setter Property="Style" TargetName="OuterBorder" Value="{DynamicResource OuterBorderTopSelectStyle}"/> 
      <Setter Property="Style" TargetName="InnerBorder" Value="{DynamicResource InnerBorderTopFocusStyle}"/> 
     </Trigger> 
     <!--<Trigger Property="IsKeyboardFocused" Value="True">--> 
     <Trigger Property="IsKeyboardFocused" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsFocused}"> 
      <Setter Property="Style" TargetName="OuterBorder" Value="{DynamicResource OuterBorderBottomFocusStyle}"/> 
      <Setter Property="Style" TargetName="InnerBorder" Value="{DynamicResource InnerBorderTopFocusStyle}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 

</ControlTemplate> 

Как вы можете видеть, что я пытаюсь связать к ComboBox 'фокус состояния s, но это Безразлично' т внутри Trigger.

Любая помощь приветствуется. Извините за вопрос noob. Благодаря!

ответ

4

Самый простой способ сделать это - привязать к Исправленному шаблону Templated Parent. Примечание: Режим = OneWay важен, поскольку IsFocused доступен только для чтения. Вы могли бы сделать что-то вроде этого:

<DataTrigger Binding="{Binding IsFocused, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=OneWay}" Value="True"> 
    <Setter Property="Style" TargetName="OuterBorder" Value="{DynamicResource OuterBorderBottomFocusStyle}"/> 
    <Setter Property="Style" TargetName="InnerBorder" Value="{DynamicResource InnerBorderTopFocusStyle}"/> 
</DataTrigger > 
+0

Спасибо, мы попробуем! – dex3703

+0

Удивительный, это сделал трюк для меня. – Daniel

0

Вы хотите настроить или выбрали FocusVisualStyle: Смотрите здесь: MSDN: Styling for Focus in Controls, and FocusVisualStyle

Я думаю, что синие вы хотите иметь от некоторой исходного окна темы, возможно, он содержится в этих загрузках Default WPF Themes от Microsoft WPF Samples.

+0

Фокусировка только нарисована вокруг текстового поля внутри элемента управления. Я хочу, чтобы стиль togglebutton был выделен. – dex3703

0

Вы установили Focusable=False для вашего ToggleButton в ControlTemplate, поэтому, когда он получает фокус, он передает его в следующий внутренний настраиваемый UIElement. Если вы удалите это, ваш ToggleButton должен получить фокус вместо TextBox.

+0

Выполнение этого приводит к тому, что combobox получает фокус дважды - вы получаете пунктирную линию вокруг выпадающего списка, а затем вниз в togglebutton. Вы дважды вставляете вкладку и оставляете ее в поле со списком. – dex3703

+0

UISpy не регистрируется при переходе к переключателю - он просто остается на «combobox», когда вы вставляете его в оба раза. Я хочу одно фокусное событие для combobox. Текстовое поле также должно получать фокус, когда редактируемое поле со списком редактируется. – dex3703

0

привязок к IsFocused prperty шаблонного родителя не работают, когда вы установите ComboBox.IsEditable свойство True. Вместо этого вы можете использовать IsKeyboardFocusWithin, проверьте следующее:

<DataTrigger Binding="{Binding IsKeyboardFocusWithin, RelativeSource={RelativeSource Mode=TemplatedParent}, Mode=OneWay}" Value="True"> 
    <Setter Property="Background" TargetName="Border" Value="{DynamicResource MainColorLight}" /> 
    <Setter Property="BorderBrush" TargetName="Border" Value="{DynamicResource MainColorLight}" /> 
    <Setter Property="BorderBrush" TargetName="Border2" Value="{DynamicResource MainColorLight}" /> 
    <Setter Property="Fill" TargetName="Arrow" Value="White" /> 
</DataTrigger > 
Смежные вопросы