如何在WPF中的TrayPopup上自动聚焦文本框?

时间:2015-08-17 06:17:38

标签: c# wpf

我正在使用来自hardcodetTaskbarIcon申请。当我激活CustomTrayPopup时,我希望我的CustomTextBox能够得到关注。 xaml中的正常方式似乎不起作用。

这是我的代码:

<UserControl [...]>
    <Grid x:Name="Grid">
        <Border [...]>
            [...]
        </Border>
        <TextBox [...]
                 FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"
                 > [...]
                <TextBox.Template>
                    [...]
                </TextBox.Template>
            </TextBox>
        <ListBox [...]>[...]
        </ListBox>
    </Grid>
</UserControl>

调用TextBox时,是否有某种方法可以使TrayPopup自动对焦?如果xaml或代码背后无关紧要。

更新1: 我的CustomTextBoxButtonTextField组成。这是我的TextBox.Template

里面的内容
<ControlTemplate>
  <Border [...]>
    <VisualStateManager.VisualStateGroups>[...]
    </VisualStateManager.VisualStateGroups>
    <DockPanel>
      <Button [...]>
        <Image [...]/>
        <Button.Style>[...]
        </Button.Style>
      </Button>
      <ScrollViewer Margin="0"
                    x:Name="PART_ContentHost"/>
    </DockPanel>
  </Border>
</ControlTemplate>

是否可能FocusManager无法处理TextBox内的按钮?

更新2: 我在OnClick内为Button添加了CustomTextBox方法,其中所有文本都已选中,PART_ContentHost得到了关注。但是当我尝试使用OnLoaded方法或其他方法时,它不起作用。

更新3: 这是我的TextBox的完整模板,如果它很重要。

<TextBox KeyDown="SearchBox_KeyDown"
                 x:Name="SearchBox"
                 Width="160" 
                 Height="20" 
                 Margin="10,10,150,130"
                 SnapsToDevicePixels="True"
                 OverridesDefaultStyle="True"
                 Foreground="#FFFFFFFF"
                 Text="Some"
                 >

                <TextBox.CaretBrush>
                    <SolidColorBrush Color="#FF997137"/>
                </TextBox.CaretBrush>
                <TextBox.Template>
                    <ControlTemplate>
                        <Border x:Name="Border"
                            Margin="1"
                            CornerRadius="2"
                            BorderThickness="0,0,0,1.5"
                            BorderBrush="#FF997137">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="Disabled">
                                        <Storyboard>
                                            <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                                                      Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                                                <EasingColorKeyFrame KeyTime="0"
                                                                 Value="#FF8f8f8f"/>
                                            </ColorAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="ReadOnly">
                                        <Storyboard>
                                            <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border"
                                                                      Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                                                <EasingColorKeyFrame KeyTime="0"
                                                                 Value="#FF4b4b4b"/>
                                            </ColorAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                    <VisualState x:Name="MouseOver"/>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <DockPanel>
                                <Button BorderThickness="0" 
                                        DockPanel.Dock="Left" 
                                        HorizontalAlignment="Right" 
                                        Height="15" 
                                        Width="15"
                                        Background="#00ffffff"
                                        Click="Button_Click">
                                <Image Source="/Resources/searchIco.png"
                                       Margin="2"
                                       Stretch="Fill"/>
                                <Button.Style>
                                    <Style TargetType="{x:Type Button}">
                                        <Setter Property="Template">
                                            <Setter.Value>
                                                <ControlTemplate TargetType="{x:Type Button}">
                                                    <Border Background="{TemplateBinding Background}">
                                                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
                                                    </Border>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                        <Style.Triggers>
                                            <Trigger Property="IsMouseOver" Value="True">
                                                <Setter Property="Background" Value="#00ffffff"/>
                                            </Trigger>
                                        </Style.Triggers>
                                    </Style>
                                </Button.Style>
                            </Button>
                                <ScrollViewer Margin="0"
                                              x:Name="PART_ContentHost"/>
                            </DockPanel>
                        </Border>
                    </ControlTemplate>
                </TextBox.Template>
            </TextBox>

1 个答案:

答案 0 :(得分:0)

您可以使用IsVisibleChanged事件来关注TextBox。这不仅在View或Usercontrol加载时设置焦点,而且如果您通过Visibility更改Views也是如此。如果您尝试通过Loaded事件设置它,则在隐藏和显示的情况下可能不会触发事件。因此,在VisibilityChange上更改控件的焦点非常有用,因为它始终会触发。

以下是通过UserControl

中的代码设置Focus对文本框的示例
public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();

            this.IsVisibleChanged += UserControl1_IsVisibleChanged;
        }

        void UserControl1_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
        {         
           txt.Focus();
         //txt is the name of the TextBox which is to be focused
        }
    }