渲染到屏幕外缓冲区时,WPF文本框焦点

时间:2011-06-27 12:18:39

标签: wpf textbox focus rendertargetbitmap

我使用RenderTargetBitmap将文本框渲染到屏幕外缓冲区,我想在此文本框中输入文本,但是,我无法设置文本框焦点(使用Focus()无效 - 可能是因为画布没有附加到一个真正的窗口?)这有两个结果:1键盘输入没有被捕获2.即使我使用TextBox文本和CaretIndex = index手动设置文本我没有得到一个插入因为缺乏焦点。有没有办法以某种方式使这个焦点?如果没有,即使没有焦点,我也希望至少看到插入符号,但是看不到这样做的方法。

1 个答案:

答案 0 :(得分:0)

您将需要在真实窗口中托管的内容才能使其正常工作,因为Windows只会将键盘输入直接发送到活动窗口。你还没有说清楚为什么你希望你的TextBox不被托管在一个真实的窗口中,所以你很难知道你希望如何捕获键盘输入 - 你能详细说明你的场景吗?

从上下文中我必须猜测,在您的场景中确保原始文本框不可见非常重要。实际上,您可以将文本框放在窗口中,使其保持活动状态,并且能够接收所有形式的输入,而不会实际显示。这是一种方式:

<Grid>
    <Grid
        x:Name="container"
        HorizontalAlignment="Left" VerticalAlignment="Top"
        Margin="69,42,0,0"
        Opacity="0"
        >
        <TextBox
            Name="textBoxToRender"
            Height="23" Width="120"
            TextChanged="textBoxToRender_TextChanged"
            />
    </Grid>

</Grid>

此处的TextBox元素本身非常普通,但我已将其置于Grid内,通过将其Opacity设置为0,我将其置于隐身状态。键盘输入的目的,它仍然被认为是可见的。因为我已将Opacity应用于包含Grid而非TextBox本身,您可以将其与RenderTargetBitmap一起使用。这是代码隐藏中的文本更改事件处理程序:

private void textBoxToRender_TextChanged(object sender, TextChangedEventArgs e)
{
    var rtb = new RenderTargetBitmap(
        (int) textBoxToRender.ActualWidth, (int) textBoxToRender.ActualHeight,
        96, 96, PixelFormats.Pbgra32);

    rtb.Render(textBoxToRender);

    rectangle1.Fill = new ImageBrush(rtb);
}

最后一行仅用于验证目的 - 我正在使用带有画笔的图像来绘制一个矩形以检查它应该是什么样的。我的主要Xaml也包含这个:

<Rectangle Height="72" HorizontalAlignment="Left" Margin="74,167,0,0"
   Name="rectangle1" Stroke="Black" VerticalAlignment="Top" Width="255" />

我的codebehind的构造函数包含:

textBoxToRender.Focus();

当我开始输入时,我可以看到(由于尺寸不匹配而导致扭曲)我的文本框的位图副本出现在矩形中,验证我能够获得文本框的位图副本,文字输入,焦点,插入符号和所有内容。

文本框本身仍保持“屏幕外”,因为它仍然不可见。

由于我不清楚你究竟想做什么,我不知道这有什么用,但我希望它有用。