专注于autocompletebox中的文本框?

时间:2014-03-11 21:27:51

标签: c# wpf xaml autocompletebox

这是我的xaml:

 <toolkit:AutoCompleteBox Name="signalNameEditor"
                         ItemsSource="{Binding MySource}"
                         SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
                         IsTextCompletionEnabled="True"                             
                         FilterMode="StartsWith"
                         ValueMemberPath="Label"
                         MinimumPrefixLength="3"
                         MinimumPopulateDelay="800"
                         Style="{StaticResource autoCompleteBoxStyle}">

    <toolkit:AutoCompleteBox.ItemTemplate>            
        <DataTemplate>                
            <StackPanel>
                <TextBlock Name="textBlock" Text="{Binding Label}"/>
            </StackPanel>
         </DataTemplate>
    </toolkit:AutoCompleteBox.ItemTemplate>        
</toolkit:AutoCompleteBox>

那么,我怎么能在我的视图中获得textblock元素?我试过这个:

var textBlock = signalNameEditor.FindName("textBlock");

但这是错误的。那么你可以帮我解决这个问题或者将我重新定位到一个合适的解决方案。提前谢谢。

感谢所有的工作

 var textBlock = ((StackPanel)signalNameEditor.ItemTemplate.LoadContent()).FindName("textBlock") as TextBlock;

但遗憾的是我没有得到我预期的结果。问题是如何在自动完成框中关注文本框,这样当焦点在autocompletebox上时,我可以在没有双击的情况下写一些东西。 我以为我可以在我的观点中做点什么

public void SetFocus { var textBlock = ((StackPanel)signalNameEditor .ItemTemplate .LoadContent()) .FindName("textBlock") as TextBlock;
textBlock.Focus(); }

我知道有很多关于如此设置焦点的示例 autocompletebox focus in wpf 但我无法让它对我有用。有没有一个解决方案,我可以在不编写AutoCompleteFocusableBox类的情况下获得?

2 个答案:

答案 0 :(得分:2)

解决方案更简单。实际上我需要将焦点放在自动完成框中的文本框上。为此,我使用了定义为常规样式http://msdn.microsoft.com/ru-ru/library/dd728668(v=vs.95).aspx

的样式

在我看来,我可以使用以下内容:

public void SetFocus()
{
        var textbox = this.editor.Template.FindName("Text", editor) as TextBox;
        textbox.Focus();
}

答案 1 :(得分:0)

您可以编写扩展名并为文本框设置自定义属性以使其可聚焦

例如,您可以编写扩展类,如下所示

public static class FocusBehavior
{
    #region Constants

    public static readonly DependencyProperty IsFocusedProperty =
        DependencyProperty.RegisterAttached("IsFocused", typeof (bool?),
            typeof (FocusBehavior), new FrameworkPropertyMetadata(IsFocusedChanged));

    #endregion

    #region Public Methods

    public static bool GetIsFocused(DependencyObject obj)
    {
        return (bool) obj.GetValue(IsFocusedProperty);
    }

    public static void SetIsFocused(DependencyObject obj, bool value)
    {
        obj.SetValue(IsFocusedProperty, value);
    }

    #endregion

    #region Event Handlers

    private static void IsFocusedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var uie = (UIElement) d;

        if ((bool) e.NewValue)
            uie.Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(() => Keyboard.Focus(uie)));
    }

    #endregion Event Handlers
}

然后在xaml中如下:

<UserControl xmlns:behaviours="clr-namespace:Example.Views.Behaviours">


<TextBox TextWrapping="Wrap" Text="TextBox" behaviours:FocusBehavior.IsFocused={Binding IsFocused}/>

我希望回答你的问题