我有一个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触发器)。
答案 0 :(得分:1)
我不确定您想要什么,但根据我的了解,您需要:
根据我的理解,我创建了一个可以帮助您的示例:
<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>