2017-02-20 69 views
1

我有一個自定義的組合框來處理文本輸入並過濾itemsource。我遇到的問題是,當我打開組合框時,文本框被關注並讓我在其中寫入,然後如果我關閉並再次打開它,TextBox不會集中,我不能在裏面寫任何東西。我發現第一次comboBox打開時,它將焦點設置在TextBox上,但是當我關閉它時,TextBox保持它的IsFocused屬性爲true,所以當重新打開問題發生時。這只是當打開並重新打開單擊組合框,因爲如果我單擊組合框之外關閉它,然後再次打開它一切正常。重新打開組合框中的下拉框時,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; 
    } 
} 

這解決了這個問題,現在它的工作的偉大,那屬性被設置爲組合框。