【问题标题】:Checkbox checked and unchecked events are being fired when I select an expander当我选择扩展器时,复选框选中和未选中的事件被触发
【发布时间】:2015-08-10 14:32:32
【问题描述】:

我刚刚注意到这个问题,每当我选择一个其父级为复选框的扩展器时,即使未选中该复选框,它也会触发选中/未选中事件。

这是一个显示它发生的 .gif。右上角的数字代表选中的复选框的数量,我设置为在选中或取消选中复选框时向上和向下计数。计数器本身并不是这里的担心,只是一种显示它发生的方式。

对于每个复选框,它们的 CheckedUnChecked 事件指向我选择的方法。

是什么导致了这种情况发生,我该如何预防?

编辑:XAML

            <Expander Loaded="VerifyExpanderLoaded" ExpandDirection="Down" IsExpanded="True" FontSize="14" FontWeight="Bold" Margin="5" BorderThickness="1" BorderBrush="#FF3E3D3D">
            <Expander.Header>
                <DockPanel RenderTransformOrigin="0.5,0.5" LastChildFill="False" Margin="0" HorizontalAlignment="Stretch">
                    <TextBlock Text="Verify Caller and Account" DockPanel.Dock="Left" VerticalAlignment="Center" Margin="0"/>
                    <Button DockPanel.Dock="Right" Margin="1,0" Click="VerifyUncheckAll">
                        <TextBlock Text="Uncheck All" Margin="1,0" FontSize="12" FontWeight="Normal"/>
                    </Button>
                    <Button DockPanel.Dock="Right" Margin="1,0" Click="VerifyCheckAll">
                        <TextBlock Text="Check All" FontSize="12" FontWeight="Normal" Margin="1,0"/>
                    </Button>
                    <TextBlock x:Name="VerifyCheckboxCount" Text="0/0" DockPanel.Dock="Right" VerticalAlignment="Center" FontSize="16" FontWeight="Bold" Margin="0,0,10,0"/>
                </DockPanel>
            </Expander.Header>
            <ListBox Background="{x:Null}" BorderBrush="{x:Null}">
                <CheckBox x:Name="Authentication_CallerName_Checkbox" HorizontalAlignment="Center" Margin="10,5,0,0" Grid.ColumnSpan="2" FontSize="12" VerticalAlignment="Center" Checked="VerifyCheckBoxChecked" Unchecked="VerifyCheckBoxChecked">
                    <StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
                        <TextBlock Text="Caller's Name" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="14"/>
                        <StackPanel>
                            <Expander ExpandDirection="Right" Margin="5,2,0,0" VerticalAlignment="Bottom" HorizontalAlignment="Right" FontSize="14">
                                <TextBlock Text="Obtain Callers Name " HorizontalAlignment="Center" Margin="0" VerticalAlignment="Center" FontWeight="Normal" FontStyle="Italic">
                                <Hyperlink x:Name="AuthenticationWikiLink" NavigateUri="[Redacted]" RequestNavigate="ExternalLinks">
                                    Link
                                </Hyperlink>
                                </TextBlock>
                            </Expander>
                        </StackPanel>
                    </StackPanel>
                </CheckBox>

【问题讨论】:

  • 可以给我们一些代码吗?将复选框放在扩展器中时存在绑定问题...
  • 为什么需要防止它发生?它会导致什么问题?
  • 在 XAML 中添加。大卫,因为它导致计数器在事件触发时根据其 IsChecked 属性将复选框计数为选中或未选中。我知道有一些方法可以解决这个问题,我可以使用其他方法来确定它是否被检查。然而,这超出了这个问题的范围。
  • 我也可以为复选框的父级提供代码吗,似乎它也是一个扩展器..
  • 我认为这是因为您将扩展器作为复选框的 content 的一部分,因此复选框内容中的任何点击事件(例如扩展扩展器)也会影响复选框事件。尝试先放置一个带有复选框的水平堆栈面板,然后将扩展器作为单独的项目。

标签: wpf xaml events checkbox expander


【解决方案1】:

发生这种情况的原因是什么?

我不知道。我猜它是因为路由事件而发生的。 如果您将 eventArgs 设置为在正确的事件中处理,您可能可以防止这种情况发生。

我该如何预防?

首先是我使用的 XAML。它基于您发布的版本的简化版本。

<CheckBox x:Name="checkbox" Checked="VerifyCheckBoxChecked" Unchecked="VerifyCheckBoxChecked">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="Test:" VerticalAlignment="Center"/>
        <StackPanel>
            <Expander ExpandDirection="Right" Margin="5,2,0,0" VerticalAlignment="Bottom" HorizontalAlignment="Right" FontSize="14" MouseEnter="Expander_MouseEnter" MouseLeave="Expander_MouseLeave">
                <TextBlock Text="Open" VerticalAlignment="Center"/>
            </Expander>
        </StackPanel>
    </StackPanel>
</CheckBox>

这是.cs

public partial class MainWindow : Window
{
    bool mouseOverExpander = false;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void VerifyCheckBoxChecked(object sender, RoutedEventArgs e)
    {
        if (!mouseOverExpander)
        {
            if (true) ;
        }
    }

    private void Expander_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
    {
        mouseOverExpander = true;
    }

    private void Expander_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
    {
        mouseOverExpander = false;
    }
}

这不会阻止不需要的 VerifyCheckBoxChecked 调用,但会过滤掉它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 2013-02-02
    • 2015-08-09
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    相关资源
    最近更新 更多