2017-02-20 3 views
1

テキスト入力を処理してitemsourceをフィルタリングするためのカスタマイズされたComboBoxがあります。私が抱えている問題は、ComboBoxを開いてTextBoxにフォーカスを当てて書き込むと、TextBoxが閉じられて再び開くと、TextBoxがフォーカスされず、何も書き込めないということです。コンボボックスを開いて初めてTextBoxのフォーカスを設定していることがわかりましたが、TextBoxを閉じるとTextBoxのIsFocusedプロパティはtrueのままになり、問題が再び発生したときに表示されます。 ComboBoxの外側をクリックして閉じてからもう一度開くと、すべてがうまく動作するため、コンボボックスをクリックして再度開くときです。ComboBoxのドロップダウンを再度開くときにTextBoxがフォーカスをリセットしない

ここに私が書いたカスタマイズされたスタイルと私が使用しているComboBoxがあります。

<Style x:Key="FilteringComboBox" TargetType="ComboBox"> 
    <Setter Property="SnapsToDevicePixels" Value="true" /> 
    <Setter Property="OverridesDefaultStyle" Value="true" /> 
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> 
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Visible" /> 
    <Setter Property="ScrollViewer.CanContentScroll" Value="true" /> 
    <Setter Property="IsEditable" Value="True"/> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="FontFamily" Value="Coves"/> 
    <Setter Property="FontWeight" Value="Normal"/> 
    <Setter Property="FontSize" Value="12"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="ComboBox"> 
       <Border x:Name="TopBorder" 
         CornerRadius="8" 
         BorderBrush="Grey" 
         BorderThickness="1" 
         Padding="10,0,1,0"> 
        <Border.Background> 
         <LinearGradientBrush EndPoint="0.504,1.5" StartPoint="0.504,0.03"> 
          <GradientStop Color="White" Offset="0"/> 
          <GradientStop Color="#e3e3e5" Offset="0.65"/> 
         </LinearGradientBrush> 
        </Border.Background> 
        <Grid> 
         <ToggleButton 
         Name="ToggleButton" 
         Template="{DynamicResource FilteringComboBoxToggleButton}" 
         Grid.Column="2" 
         Focusable="false" 
         IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}" 
         ClickMode="Press"> 
         </ToggleButton> 

         <TextBlock Name="ContentSite" IsHitTestVisible="False" 
             Text="{Binding Source={StaticResource Proxy}, Path=Data.Name, UpdateSourceTrigger=PropertyChanged}" 
             Visibility="Visible" Foreground="#37465c" 
             Padding="3,3,23,3" VerticalAlignment="Center" 
             HorizontalAlignment="Left" /> 

         <TextBox x:Name="PART_EditableTextBox" MaxWidth="215" MinWidth="100" 
           Text="{Binding Source={StaticResource Proxy}, Path=Data.FilterText, UpdateSourceTrigger=PropertyChanged}"                            
           Foreground="#37465c" 
           HorizontalAlignment="Left" VerticalAlignment="Center" Margin="3,3,23,3" Focusable="True" Background="Transparent" 
           Visibility="Collapsed"/> 

         <Popup x:Name="Popup" Placement="Bottom" IsOpen="{TemplateBinding IsDropDownOpen}" AllowsTransparency="True" 
           Focusable="False" PopupAnimation="Fade"> 
          <StackPanel Orientation="Vertical" Width="215"> 
           <Grid Name="DropDown" SnapsToDevicePixels="True" 
            MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
            <Border x:Name="DropDownBorder" BorderThickness="1" 
              BorderBrush="#888"> 
             <Border.Background> 
              <LinearGradientBrush EndPoint="0.504,1.5" StartPoint="0.504,0.03"> 
               <GradientStop Color="White" Offset="0"/> 
               <GradientStop Color="#e3e3e5" Offset="0.65"/> 
              </LinearGradientBrush> 
             </Border.Background> 
             <ScrollViewer Margin="0" SnapsToDevicePixels="True"> 
              <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained"/> 
             </ScrollViewer> 
            </Border> 
           </Grid> 
          </StackPanel> 
         </Popup> 
        </Grid> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Cursor" Value="Hand"/> 
        </Trigger> 
        <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
         <Setter Property="IsDropDownOpen" Value="True"/> 
         <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible" /> 
         <Setter TargetName="ContentSite" Property="Visibility" Value="Collapsed" /> 
         <Setter Property="IsEditable" Value="True"/> 
        </Trigger> 
        <Trigger Property="IsMouseCaptured" Value="False"> 
         <Setter Property="IsDropDownOpen" Value="False"/> 
         <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Collapsed" /> 
         <Setter TargetName="ContentSite" Property="Visibility" Value="Visible" /> 
         <Setter Property="Text" Value=""/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

これは私がこれらを使用していたので、誰か、不安定な動作が起こっていたのに役立ちますことを願っていますが、私はフォーカスを削除するには、このイベントハンドラを追加しようとしたが、それは

private static void QuantityBox_IsMouseCapturedWithin(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    var qBox = sender as ComboBox; 

    if (qBox.IsDropDownOpen == false) 
    { 
     Keyboard.ClearFocus(); 
     flag = true; 
    } 
} 

答えて

0

が動作していませんトリガー:

<Trigger Property="IsKeyboardFocusWithin" Value="True"> 
    <Setter Property="IsDropDownOpen" Value="True"/> 
    <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Visible" /> 
    <Setter TargetName="ContentSite" Property="Visibility" Value="Collapsed" /> 
    <Setter Property="IsEditable" Value="True"/> 
</Trigger> 
<Trigger Property="IsMouseCaptured" Value="False"> 
    <Setter Property="IsDropDownOpen" Value="False"/> 
    <Setter TargetName="PART_EditableTextBox" Property="Visibility" Value="Collapsed" /> 
    <Setter TargetName="ContentSite" Property="Visibility" Value="Visible" /> 
    <Setter Property="Text" Value=""/> 
</Trigger> 

トリガーは視認性トグルTexBlockとTextBoxの間(ComboBoxが非アクティブなときにTextBlockを表示し、ユーザーが入力してフィルタリングできるようにフォーカスしているときにTextBoxを表示) は、だから私は、トリガを削除し、依存関係プロパティでその振る舞い取り扱わ:

public static readonly DependencyProperty MouseCapturedProperty = DependencyProperty.RegisterAttached("MouseCaptured", 
     typeof(bool), typeof(QuantitiesBoxBehaviours), 
     new UIPropertyMetadata(false, MouseCapturedPropertyChangedCallback));   

public static bool GetMouseCaptured(UIElement element) 
{ 
    return (bool)element.GetValue(MouseCapturedProperty); 
} 

public static void SetMouseCaptured(UIElement element, bool command) 
{ 
    element.SetValue(MouseCapturedProperty, command); 
} 

private static void MouseCapturedPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var qBox = d as ComboBox; 
    bool value = GetMouseCaptured(qBox); 
    if (qBox != null && value) 
    { 
     qBox.IsMouseCaptureWithinChanged += QBox_IsMouseCaptureWithinChanged; 
     qBox.DropDownOpened += QBox_DropDownOpened; 
    } 
} 

private static void QBox_DropDownOpened(object sender, EventArgs e) 
{ 
    var qBox = sender as ComboBox; 
    var template = qBox.Template; 
    var txtBox = template.FindName("PART_EditableTextBox", qBox) as TextBox; 
    var txtBlock = template.FindName("ContentSite", qBox) as TextBlock; 
    txtBlock.Visibility = Visibility.Collapsed; 
    txtBox.Visibility = Visibility.Visible; 
} 

private static void QBox_IsMouseCaptureWithinChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    var qBox = sender as ComboBox; 
    var template = qBox.Template; 
    var txtBox = template.FindName("PART_EditableTextBox", qBox) as TextBox; 
    var txtBlock = template.FindName("ContentSite", qBox) as TextBlock; 

    if (qBox.IsDropDownOpen == false) 
    { 
     Keyboard.ClearFocus(); 
     txtBox.Visibility = Visibility.Collapsed; 
     txtBlock.Visibility = Visibility.Visible;     
     qBox.ItemsSource = _presentationQuantities; 
     flag = true; 
    } 
} 

問題を解決し、今では素晴らしい働いて、そのプロパティがコンボボックスに設定しました。

関連する問題