【问题标题】:XAML Trigger on visibility of button setting focusmanager.focusedelement only fires once按钮设置 focusmanager.focusedelement 可见性的 XAML 触发器仅触发一次
【发布时间】:2016-12-16 01:26:11
【问题描述】:

我正在尝试根据按钮的折叠可见性更改 XAML 中的焦点。触发器将运行我创建的转换器一次而不是再次。我无法使用后面的代码,也无法命名 UIElements。

我已经尝试了很多事情,例如使用 Datatrigger 代替 AutoCodeSuccess 在下面的可见性绑定。同样,它只会运行一次转换器。按钮可见性的绑定没有问题,所以我认为我可以将该属性与 Datatrigger 一起使用。

                    <Button Grid.Column="2" VerticalAlignment="Bottom" HorizontalAlignment="Left" Margin="5" Visibility="{Binding AutoCodeSuccess, Converter={StaticResource ReverseBoolToVisCollapse}, FallbackValue=Visible}" Content="Auto-Code" Width="75" Command="{Binding AutoCodeClick}">
                        <Button.Style>
                            <Style TargetType="{x:Type Button}" BasedOn="{StaticResource AccentedSquareButtonStyle}">
                                <Style.Triggers>
                                    <Trigger Property="Visibility" Value="Collapsed">
                                        <Setter Property="FocusManager.FocusedElement" Value="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource GetNextLogicalFocus}}"/>
                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </Button.Style>
                    </Button>

这是转换器:

Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
    Dim curUIElement = DirectCast(value, UIElement)
    curUiElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next))
    Return FocusManager.FocusedElementProperty
End Function

有什么建议可以让数据触发器正常工作吗?我检查了我以前涉及数据触发器的代码(不是可见性),以前从未遇到过问题。这是在 .NET Framework 4 中。

【问题讨论】:

    标签: .net wpf xaml triggers


    【解决方案1】:

    PredictFocus 有一个解决方法,但您必须使用方向(上/下/左/右),因为下一步不是一个有效的选择。

    Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As CultureInfo) As Object Implements IValueConverter.Convert
        Dim curUIElement = DirectCast(value, UIElement)
        Return curUiElement.PredictFocus(FocusNavigationDirection.Down)
    End Function
    

    使用数据触发器

    <Button Grid.Column="2" Margin="5" Width="75" 
            Content="Auto-Code" Command="{Binding AutoCodeClick}">
        <Button.Style>
            <Style TargetType="{x:Type Button}" BasedOn="{StaticResource AccentedSquareButtonStyle}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding AutoCodeSuccess}" Value="false">
                        <Setter  Property="Visibility" 
                                 Value="Collapsed" />
                        <Setter  Property="FocusManager.FocusedElement" 
                                 Value="{Binding RelativeSource={RelativeSource Self}, 
                                         Converter={StaticResource GetNextLogicalFocus}}"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>
    

    【讨论】:

    • 太棒了!我假设根据您的回答,这与可见性已绑定并且数据触发器也处于可见性这一事实有关,这可能会在第一次使用数据触发器后解开数据触发器。或者,因为转换器设置焦点以及返回可能会以某种方式解开转换器。此外,predictfocus 正是我使用该转换器寻找的。只是假设这不是一件事,然后用我从不喜欢的设置转向另一个方向。
    猜你喜欢
    • 2013-09-23
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2014-10-22
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多