WPF texbox фокус при рендеринге в внеэкранный буфер - PullRequest
2 голосов
/ 27 июня 2011

Я отрисовываю текстовое поле во внеэкранный буфер, используя RenderTargetBitmap, и я хочу ввести текст в это текстовое поле, однако я не могу установить фокус текстового поля (использование Focus () не имеет никакого эффекта - вероятно, потому что холст не присоединенк реальному окну?) это имеет два следствия: 1 ввод с клавиатуры не фиксируется 2. даже если я установил текст вручную, используя текст TextBox, и CaretIndex = index, я не получаю каретку из-за недостатка фокуса.Есть ли способ сделать этот фокус как-то?и если нет, то я бы хотел, чтобы каретка была видна, даже если нет фокуса, но я не вижу способа сделать это.

1 Ответ

0 голосов
/ 30 июня 2011

Вам понадобится разместить эту вещь в реальном окне, чтобы это работало, потому что 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.Вот мой обработчик события изменения текста в codebehind:

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();

И когда я начинаю печатать, я вижу (искаженный, из-за несоответствующих размеров)растровая копия моего текстового поля отображается в прямоугольнике, подтверждая, что я могу получить растровую копию текстового поля с вводом текста, фокусом, кареткой и всем.

Само текстовое поле остается "за кадром »в том смысле, что он остается невидимым.

Поскольку мне неясно, что вы на самом деле пытаетесь сделать, я понятия не имею, помогает ли это вообще, но я надеюсь, что это полезно.

...