0

У меня есть несколько sdk AutoCompleteBox, которые я просто хочу установить IsTabStop="False". Если вы это сделаете, он будет проигнорирован и все еще будет принимать действие focus/tab.SDK AutoCompleteBox игнорирует IsTabStop нечетная проблема

Так что я пошел рыть в the template и нашел встроенный TextBox там с ней явно жёстко к IsTabStop=True поэтому я полагал, что я мог бы просто вытащить, что из, TemplateBind в неиспользуемом свойство как Tag, чтобы установить его на уровне экземпляра и просто обеспечить сеттер в шаблоне по умолчанию True, правильно?

Никакой радости, хотя она все еще игнорирует это. Поэтому я попробовал просто установить его False явно в шаблоне. Который, конечно, достаточно удаляет его из порядка Tab. ОДНАКО, он также отключает управление, поэтому он не будет принимать фокус или редактировать вообще.

Я столкнулся с подобными ситуациями в прошлом, но ни один из моих трюков не работает. Кто-то сталкивался с этим раньше? Что мне не хватает, чтобы просто вычеркнуть эту чертову штуку? Я также довольно смущен, почему установка IsTabStop на встроенный TextBox отключит элемент управления из всех hittestvisibility.

Не знаете, где аргументация заключается в том, что аргумент просто игнорирует свойство и не находит объяснения в каких-либо документах все же.

Итак, может быть, еще одна пара глаз может помочь, прежде чем я зашел слишком далеко вниз по кроличьей дыре для чего-то вроде бы столь простого, любых мыслей? Благодаря!

ответ

1

TextBox внутри может только собственный фокус клавиатуры AutoCompleteBox когда все criteria for focus ownership выполнены:

  • должны быть получены из Control
  • должен быть включен
  • должен быть виден
  • должен быть загружен (как протестировать: Loaded событие уволено/визуально родительское в не null больше [я использую метод расширения IsLoaded])
  • и ... IsTabStop должен быть истинным

Поэтому вы должны позволить внутреннему TextBox есть свое tabstoppy пути. Но у нас есть другие возможности. Я думал об использовании ContentControl и настройке TabNavigation="Once". Насколько я понял, предполагается, что элемент управления и весь его контент будут вести себя как одна сплошная часть в цепочке навигации на вкладке, поэтому теоретически при табуляции вы наступаете на ContentControl, но никогда не попадаете в его содержимое.

Но я попробовал и не работает должным образом. Не знаю, где мое мышление здесь не так.

Я играл с ним и нашел следующее решение работает:

Окружите их с FocusDitcher (мы выводим из ContentControl унд сделать контроль канаву фокус OnGotFocus, но если срабатывает пользователь должен щелкнуть в внутренний TextBox). В качестве альтернативы мы могли бы написать для этого Behavior. Для фокуса, управление должно саботировать одно из предпосылок для владения аккордом, например, переход в отключенный режим и обратно к включенному (не работает с IsTabStop, попробовал его, не удалось).

// helper control 
public class FocusCatcher : Control { } 

[TemplatePart(Name = "ReversedTabSequenceEntryPointElement", Type = typeof(UIElement))] 
public class FocusDitcher : ContentControl 
{ 
    public FocusDitcher() 
    { 
     DefaultStyleKey = typeof(FocusDitcher); 
     TabNavigation = KeyboardNavigationMode.Once; 
    } 

    private UIElement m_reversedTabSequenceEntryPoint; 

    protected override void OnGotFocus(RoutedEventArgs e) 
    { 
     if (FocusManager.GetFocusedElement() == this) 
     { 
      DitchFocus(); 
     } 
    } 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 
     m_reversedTabSequenceEntryPoint = (UIElement) GetTemplateChild("ReversedTabSequenceEntryPointElement"); 
     m_reversedTabSequenceEntryPoint.GotFocus += OnReversedTabSequenceEntryPointGotFocus; 
    } 

    private void OnReversedTabSequenceEntryPointGotFocus(object sender, RoutedEventArgs e) 
    { 
     // tweak tab index to ensure that when we ditch the focus it will go to the first one in the tab order 
     // otherwise it would not be possible to ever shift+tab back to any element precceeding this one in the tab order 
     var localTabIndexValue = ReadLocalValue(TabIndexProperty); 
     TabIndex = Int32.MinValue; 
     DitchFocus(); 

     if (DependencyProperty.UnsetValue == localTabIndexValue) 
      ClearValue(TabIndexProperty); 
     else 
      TabIndex = (int) localTabIndexValue; 

    } 

    private void DitchFocus() 
    { 
     IsEnabled = false; // now we lose the focus and it should go to the next one in the tab order 
     IsEnabled = true; // set the trap for next time 
    } 
} 

и шаблон

<Style TargetType="myApp:FocusDitcher"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="myApp:FocusDitcher"> 
       <Grid> 
        <ContentPresenter 
         Content="{TemplateBinding Content}" 
         ContentTemplate="{TemplateBinding ContentTemplate}" 
         Cursor="{TemplateBinding Cursor}" 
         Margin="{TemplateBinding Padding}" 
         HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
         VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
        <myApp:FocusCatcher x:Name="ReversedTabSequenceEntryPointElement"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Damnit Мартин, я должен сделать мой путь ваш район и купить вам некоторые сорта пива (если пить то есть) раньше, чем позже человек. Имейте, чтобы вернуться к этому после утреннего ожидания, но заранее, как обычно, брат! –

+0

О, это было бы здорово. В самом деле. Дайте мне знать, когда вы планируете посетить Германию. – Martin

+0

Спасибо, стреляйте в меня по электронной почте, чтобы у меня было ваше, было бы рад, если бы у вас было несколько массажей. На самом деле, bier ist immer willkommen :) –

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

  • Нет связанных вопросов^_^