TextBox.Focus()只有在我之后有MessageBox.Show()时才有效吗?

时间:2012-09-10 15:10:02

标签: c# .net wpf textbox focus

好的,显然还有更多,但这是基础知识。这似乎是一件很简单的事情,但它没有用。

我有一个标签。 我有一个TextBox。

标签的ZIndex =“1” TextBox的ZIndex =“0”

即。它们彼此重叠,TextBox不可见。

当用户点击LABEL(现在通过PreviewMouseLeftButtonDown,但在此“工作”之后将是ViewModel中的命令)时,应用程序应将焦点设置为TextBox。

简单吧?错...

如果我有这个代码......它不起作用。

    private void inVisTxtBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            inVisTxtBox.Focus();
//            TextBox_MouseDown(sender, e);
        }

如果我有这个代码......它可以工作

 private void inVisTxtBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            inVisTxtBox.Focus();
//            TextBox_MouseDown(sender, e);
            MessageBox.Show("This is ridiculous");
        }

最后是XAML:

 <Ctrls:AControl x:Class="<location of class>"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:CommandControls="clr-namespace:<location of custom controls>" VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <Grid Margin="0,15,15,15">
        <!--<Button Height="50" Click="Button_Click">FOC</Button>-->
        <TextBox x:Name="inVisTxtBox" Focusable="True" Grid.ZIndex="0" Width="100" Margin="5"/>
        <Label Grid.ZIndex="1" Margin="5" Content="243234234234234" HorizontalAlignment="Left" Width="100" PreviewMouseLeftButtonDown="inVisTxtBox_PreviewMouseLeftButtonDown" 
               x:Name="KeyPress_TextBox"/>
    </Grid>
</Ctrls:AControl>

修改

如果我将Label设置为带有标签的模板按钮作为模板,它可以工作:

<Button x:Name="KeyPress_TextBox" Grid.ZIndex="1" Margin="5" Content="243234234234234" HorizontalAlignment="Left" Width="100" Click="KeyPress_TextBox_Click">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Label Content="{TemplateBinding Content}"/>
        </ControlTemplate>
    </Button.Template>
</Button>

为什么?

必须与事件路由/泡沫的方式有关吗?

我现在就这样做了......但我更好奇发生了什么。

此外......以下任何一项都不起作用:

Keyboard.Focus(inVisTxtBox);
FocusManager.SetFocusedElement(MainGrid,inVisTxtBox);
Keyboard.Focus(inVisTxtBox);

1 个答案:

答案 0 :(得分:0)

我复制了你的代码,它对我来说很好,即使使用previewmouseclick,其他似乎也是问题。

可能抛出消息框会使焦点停止转移到PreviewMouseLeftButtonDown事件触发后转移到的任何内容。也许UserControl本身正在成为焦点?