我正在使用 RenderTargetBitmap 将文本框渲染到屏幕外缓冲区,并且我想在此文本框中输入文本,但是,我无法设置文本框焦点(使用 Focus() 没有效果 - 大概是因为画布没有附加到真实的窗口?)这有两个后果: 1 键盘输入没有被捕获 2. 即使我使用 TextBox 文本和 CaretIndex = index 手动设置文本,由于缺乏焦点,我没有得到插入符号。有没有办法以某种方式使这个焦点?如果没有,即使没有焦点,我至少希望插入符号可见,但看不到这样做的方法。
1 回答
您需要将事物托管在真实窗口中才能正常工作,因为 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" />
我的代码隐藏构造函数包含以下内容:
textBoxToRender.Focus();
当我开始输入时,我可以看到我的文本框的位图副本(由于大小不匹配而失真)出现在矩形中,验证我是否能够获得文本框的位图副本,带有文本输入,焦点,插入符号和一切。
文本框本身仍然是“屏幕外”,因为它仍然是不可见的。
由于我不清楚您实际上要做什么,因此我不知道这是否有帮助,但我希望它有用。