突出显示已激活按钮WPF

时间:2018-08-17 13:46:52

标签: c# wpf xaml triggers

我有一个wpf表单,该表单由静态方法调用,其方式与MessageBox.Show()几乎相同;按钮布局是在方法中定义的,并且可以在某些参数内进行自定义。每个按钮都添加了BasedOn为中心样式的样式。

此样式的一部分是突出显示默认按钮的触发器,因此用户知道如果按下enter将会发生什么。但是,如果用户几次按下Tab键,则会有一个虚线的边框依次移入每个按钮,然后是他们按下Enter键时将得到的按钮。我希望我的突出显示从默认按钮开始,但要遵循此...焦点?如果用户选择在按钮之间切换,则为

我曾以为<ControlTemple.Triggers>中要触发的属性为IsFocused,但这似乎不符合我的预期-这是我的xaml代码的片段:

<!--....-->
   <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border x:Name="border" 
                        BorderThickness="1"
                        Padding="0" 
                        BorderBrush="WhiteSmoke" 
                        CornerRadius="2" 
                        Background="{TemplateBinding Background}">
                    <ContentPresenter x:Name="Contents" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True"/>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="true">
                        <Setter Property="RenderTransform" TargetName="Contents">
                            <Setter.Value>
                                <TranslateTransform X="0" Y="2"/>
                            </Setter.Value>
                        </Setter>
                    </Trigger>
                    <Trigger Property="IsDefault" Value="true">
                        <Setter Property="BorderThickness" TargetName="border" Value="3"/>
                        <Setter Property="BorderBrush" TargetName="border" Value="White"/>
                    </Trigger>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter Property="IsDefault" Value="True"/>
                    </Trigger>
                    <Trigger Property="IsFocused" Value="False">
                        <Setter Property="IsDefault" Value="False"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
<!--....-->

我认为焦点将在触发时设置默认值,这将导致突出显示(3px白色边框)随着用户按下选项卡而显示。

当用户按下Tab键时,属性会发生什么变化(和/或为什么它不响应我?)

-------------- ************编辑************ -------- -----

尝试在后面的代码中添加行以直接添加触发器。 foreach循环会跟踪自定义类项目的列表,这些类基本上是稍作修改的按钮; b.Style的类型为Style,但是要从某些资源中查找

        foreach (Buttons b in buttonList)
        {
            if (i > 0)
            {
                totalWidthNeeded = totalWidthNeeded + gapPixels;
                ColumnDefinition gapColumn = new ColumnDefinition();
                gapColumn.Width = gapWidth;
                ButtonRowGrid.ColumnDefinitions.Add(gapColumn);
                i++;
            }

            Button thisButton = new Button();

            var setter = new Setter() { Property = Button.IsDefaultProperty, Value = true};
            var trigger = new Trigger() { Property = Button.IsFocusedProperty, Value=true, Setters = { setter } };

            b.Style.Triggers.Add(trigger);

            thisButton.Style = b.Style;

可悲的是,这段代码并没有产生一个可以从上面的xaml中显示的IsDefault触发器中看到可见效果的触发器(我已经删除了两个IsFocused触发器)。

1 个答案:

答案 0 :(得分:1)

我不确定您想要什么,但根据我的了解,您需要:

  1. 突出显示默认按钮
  2. 当使用Tab键将现有按钮跳出时,突出显示当前选中的按钮

根据我的理解,我创建了一个可以帮助您的示例:

<Window.Resources>
    <ResourceDictionary>
        <Style TargetType="Button">
            <Setter Property="Padding" Value="5" />
            <Setter Property="Margin" Value="5" />
            <Style.Triggers>
                <Trigger Property="IsFocused" Value="True">
                    <Setter Property="IsDefault" Value="True" />
                    <Setter Property="BorderThickness" Value="3" />
                    <Setter Property="BorderBrush" Value="Red" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </ResourceDictionary>
</Window.Resources>
<StackPanel FocusManager.FocusedElement="{Binding ElementName=btnDefault}">
    <Button>Button 1</Button>
    <Button>Button 2</Button>
    <Button x:Name="btnDefault">Button 3</Button>
    <Button>Button 4</Button>
    <Button>Button 5</Button>
    <Button>Button 6</Button>
    <Button>Button 7</Button>
</StackPanel>