2013-03-04 3 views
0

Я много искал эту тему, но не смог найти решение для этого без использования кода. Я знаю, что некоторые скажут, что использование кода для этого взгляда связано со всеми вещами, но тем не менее я бы хотел его избежать.WPF настройка клавиатуры-фокус без кода позади во время выполнения

У меня есть usercontrol, который показывает «диалог» с одним текстовым полем и кнопкой OK. Этот диалог представляет собой простой пользовательский контроль, который размещается поверх всех остальных. По умолчанию видимость usercontrols будет свернута. Я хотел бы установить keyboardfocus в текстовое поле в usercontrol диалогового окна, если usercontrol становится видимым. Есть ли способ сделать это полностью в xaml? Поскольку мой диалог-контроль не виден в то время, когда элемент управления загружается, просто установив

FocusManager.FocusedElement="{Binding ElementName=tbID}"

не будет работать. Я попытался использовать какой-то видимый триггер видимости:

<TextBox Grid.Column="3" 
      Grid.Row="5" 
      Name="tbID" 
      VerticalAlignment="Center"> 
     <TextBox.Style> 
      <Style TargetType="{x:Type TextBox}"> 
       <Style.Triggers> 
        <Trigger Property="Visibility" Value="Visible"> 
         <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=tbID}" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </TextBox.Style> 
    </TextBox> 

но это тоже не работает. Триггер запускается, но текстовое поле не получает фокуса. Я был бы очень признателен за любые предложения по этому поводу. Заранее спасибо!

ответ

2

Я думаю, что вы хотите связать с UserControlVisibility собственности не TextBox

примере

<UserControl x:Class="WpfApplication7.IconButton" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="100" d:DesignWidth="200" Name="_this"> 
    <Grid> 
     <TextBox Name="tbID" Margin="0,12,0,0" VerticalAlignment="Top"> 
      <TextBox.Style> 
       <Style TargetType="{x:Type TextBox}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ElementName=_this, Path=Visibility}" Value="Visible"> 
          <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=tbID}" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBox.Style> 
     </TextBox> 
    </Grid> 
</UserControl> 
+0

Это душа! Я изменил ** _ этот ** в вашем коде на имя моего usercontrol, и он отлично работает! Большое спасибо. –

1

Чтобы настроить фокус, вы можете попробовать использовать прикрепленное поведение. Вот некоторые примеры кода:

public static class Focus 
{ 
    public static readonly DependencyProperty ShouldFocusWhenVisibleProperty = 
     DependencyProperty.RegisterAttached("ShouldFocusWhenVisible", typeof (bool), typeof (Focus), new PropertyMetadata(default(bool), ShouldFocusWhenVisibleChanged)); 

    private static void ShouldFocusWhenVisibleChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
    { 
     var uiElement = sender as UIElement; 
     if (uiElement == null) return; 

     var shouldFocus = GetShouldFocusWhenVisible(uiElement); 
     if (shouldFocus) 
     { 
      UpdateFocus(uiElement); 
      uiElement.IsVisibleChanged += UiElementOnIsVisibleChanged; 
     } 
     else 
      uiElement.IsVisibleChanged -= UiElementOnIsVisibleChanged; 
    } 

    private static void UiElementOnIsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     var uiElement = sender as UIElement; 
     if (uiElement == null) return; 

     UpdateFocus(uiElement); 
    } 

    private static void UpdateFocus(UIElement uiElement) 
    { 
     if (!uiElement.IsVisible) return; 

     Keyboard.PrimaryDevice.Focus(uiElement); 
    } 

    public static void SetShouldFocusWhenVisible(UIElement uiElement, bool value) 
    { 
     uiElement.SetValue(ShouldFocusWhenVisibleProperty, value); 
    } 

    public static bool GetShouldFocusWhenVisible(UIElement uiElement) 
    { 
     return (bool)uiElement.GetValue(ShouldFocusWhenVisibleProperty); 
    } 
} 

Затем примените следующий код TextBox в вашем диалоге: <TextBox local:Focus.ShouldFocusWhenVisible="True" />. Обратите внимание, что local: должно быть ссылкой на пространство имен класса Focus выше.

+0

Спасибо за ваши усилия! это также хороший способ справиться с тем, что я искал. –

+0

Только решение, которое сработало для меня! – rubiktubik

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