如何使我的控制可以集中精力?

时间:2014-01-23 08:19:39

标签: wpf wpf-controls focus keyboard-events wpf-4.0

我有一个控件

public class FocusTestControl : Control {
    public FocusTestControl() {
        DefaultStyleKey = typeof(FocusTestControl);
    }
}

这是默认风格

    <Style
    TargetType="local:FocusTestControl">
    <Setter
        Property="Focusable"
        Value="True" />
    <Setter
        Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Grid>
                    <Border
                        Background="AliceBlue" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我把这个控件放在一个窗口上:

<Window
x:Class="MakeWpfControlFocusable.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:MakeWpfControlFocusable"
Title="MainWindow"
Height="350"
Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition
            Height="35" />
    </Grid.RowDefinitions>
    <local:FocusTestControl />
    <StackPanel
        Grid.Row="1"
        Orientation="Horizontal">
        <TextBlock
            Text="Focused element: " />
        <TextBlock
            Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, Path=KeyboardFocusedElement}" />
        <TextBox
            Text="Text" />
    </StackPanel>
</Grid>

但是点击控件不能使它聚焦(我的意思是KebordFocus)

实际上,我的任务是处理KeyDown和KeyUp事件。但是当元素没有键盘焦点时,这是不可能的。

1 个答案:

答案 0 :(得分:1)

可以通过按Tab键来设置键盘焦点。但是单击控件时未设置。我订阅了MouseDown事件,并在处理程序中手动设置了焦点。

    public class FocusTestControl : Control, IInputElement {


    public FocusTestControl() {
        DefaultStyleKey = typeof(FocusTestControl);
        MouseDown += FocusTestControl_MouseDown;
    }

    void FocusTestControl_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) {
        Keyboard.Focus(this);
    }
}