WpfToolkit AutoCompleteBox样式触发器IsFocused NOT触发

时间:2013-06-18 03:57:04

标签: wpf wpftoolkit

我使用的是最新版本的WPF Toolkit。我试图设置AutoCompleteBox的样式,我似乎无法使“IsFocused”触发器工作。基本上我希望它表现得像我的TextBox样式,所以我为AutoCompleteBox做了一个。我甚至尝试将我的TextBox样式分配给AutoCompleteBox的TextBoxStyle属性,但我仍然没有看到IsFocused触发器触发。

我确实尝试在后面的代码中玩,并注意到如果我重写OnGotFocus和OnLostFocus那些永远不会被调用。但是,如果我将一些事件处理程序连接到GotFocus和LostFocus事件,那么我终于看到了一些事情发生。如果连接事件是查看IsFocused更改的唯一方法,那么这似乎是一个丑陋的黑客。是否有一些工作可以解决这个问题或我应该做些什么?

我的TexBox风格

<Style TargetType="TextBox" x:Key="TextBoxStyle">
    <Setter Property="Background" Value="{StaticResource TextBoxBackground}"/>
    <Setter Property="Foreground" Value="{StaticResource Foreground}"/>
    <Setter Property="CaretBrush" Value="{StaticResource Foreground}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Grid Background="{TemplateBinding Background}" SnapsToDevicePixels="true">
                   <ScrollViewer x:Name="PART_ContentHost" Margin="1"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter Property="Background" Value="{StaticResource TextBoxBackgroundSelected}"/>
                    </Trigger>
                    <Trigger Property="IsFocused" Value="true">
                        <Setter Property="Background" Value="{StaticResource TextBoxBackgroundSelected}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我的自动完成框样式

<Style TargetType="WpfToolkitInput:AutoCompleteBox" x:Key="AutoCompleteBoxStyle">
<Setter Property="Background" Value="{StaticResource TextBoxBackground}"/>
<Setter Property="Foreground" Value="{StaticResource Foreground}"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="TextBoxStyle" Value="{StaticResource TextBoxStyle}"/>
<Style.Triggers>
  <Trigger Property="IsMouseOver" Value="true">
    <Setter Property="Background" Value="{StaticResource TextBoxBackgroundSelected}"/>
  </Trigger>
  <Trigger Property="IsFocused" Value="true">
    <Setter Property="Background" Value="{StaticResource TextBoxBackgroundSelected}"/>
  </Trigger>
</Style.Triggers>

有什么想法吗?

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

我没有成功找到问题的优雅解决方案。我最终继承自AutoCompleteBox并使用事件处理程序执行我的逻辑。

public class AutoCompleteTextBox : AutoCompleteBox

...

public AutoCompleteTextBox()
{
   // Register the event handler for GotFocus.
   base.GotFocus += this.AutoCompleteTextBoxGotFocus;

   // Register the event handler for LostFocus.
   base.LostFocus += this.AutoCompleteTextBoxLostFocus;
}

这里没什么好看的。我只是做了自己的类型。我唯一要做的就是在构造函数中连接已知和丢失的聚焦事件处理程序。我不确定为什么但是IsFocused触发器没有接收到这些事件。此外,如果您尝试覆盖这些:“OnGotFocus”或“OnLostFocus”,它们也不起作用。因此,如果AutoCompleteBox专注于我可以找到的唯一方法是直接注册到事件。如果有人在将来遇到这种情况并且有更好的方法,请发表评论。