我正在使用RenderTargetBitmap将一个文本框呈现到离屏缓冲区,并且我想在此文本框中输入文本,但是,我无法设置文本框焦点(使用Focus()没有任何效果-可能是因为画布没有附加到真正的窗口?)这有两个结果:1键盘输入不能被捕获2.即使我使用TextBox文本和CaretIndex =索引手动设置文本,我也不会得到插入符号,因为缺少焦点。有没有办法以某种方式让这种关注成为焦点?如果没有,我希望插入符号至少是可见的,即使没有焦点,但看不到这样做的方法。
发布于 2011-07-01 02:34:16
你需要把它托管在一个真实的窗口中才能正常工作,因为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();
当我开始输入时,我可以在矩形中看到我的文本框的位图副本(由于大小不匹配而失真),验证我是否能够获得文本框的位图副本,其中包含文本输入、焦点、插入符号等等。
文本框本身保持“屏幕外”,因为它是不可见的。
因为我不清楚你到底想做什么,所以我不知道这是否有帮助,但我希望它是有用的。
https://stackoverflow.com/questions/6492743
复制相似问题