2013-03-04 59 views
0

我在那個主題上搜索了很多,但無法真正找到解決方案,無需使用任何代碼。我知道有些人會說使用代碼隱藏相關的事情是完全沒問題,但我想避免它。WPF在運行時沒有代碼的情況下設置鍵盤焦點

我有一個用戶控件,它顯示一個「對話框」,帶有單個文本框和一個確定按鈕。該對話框是一個簡單的用戶控件,放在所有其他對象之上。默認情況下,usercontrols可見性設置爲摺疊狀態。如果usercontrol可見,我想將keyboardfocus設置爲對話框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

這是靈魂!我在你的代碼中將** _ this **更改爲我的用戶控件的名稱,它的效果非常好!非常感謝你。 – 2013-03-05 10:08:56

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 local:Focus.ShouldFocusWhenVisible="True" />。請注意,local:需要是對上述Focus類名稱空間的引用。

+0

感謝你的努力!這也是一個很好的方式來處理我正在尋找的東西。 – 2013-03-05 10:10:31

+0

只爲我工作的解決方案! – rubiktubik 2017-12-30 19:57:28

相關問題