【问题标题】:Tunnel Dockpanel Mousedown Event To Checkbox in WPF隧道 Dockpanel Mousedown 事件到 WPF 中的复选框
【发布时间】:2015-04-07 10:11:57
【问题描述】:

在我的 WPF 应用程序中,我有很多由复选框和标签组成的 DockPanel。我想让应用程序处理 DockPanel 的 mousedown 事件,就像单击了复选框一样,即用户不必专门单击复选框;他还可以单击标签以选中/取消选中复选框。 我添加了一个事件处理程序“DockPanel_MouseDown”,它只是翻转了复选框的 IsChecked 属性,这很有效。 我的问题是我有很多 DockPanel,我不想给每个复选框和每个停靠面板起一个名字,并编写数百个基本上做同样事情的事件处理程序。 有没有办法将这种行为放在样式或模板中? C

【问题讨论】:

    标签: wpf templates checkbox styles


    【解决方案1】:

    为什么要使用单独的标签来选中和取消选中复选框?

    Use this Alternative solution

    <StackPanel> <CheckBox IsChecked="{Binding IsChecked, ElementName=checkbox}" Content="Hello"> <CheckBox.Template> <ControlTemplate TargetType="CheckBox"> <ContentPresenter/> </ControlTemplate> </CheckBox.Template> </CheckBox> <CheckBox x:Name="checkbox" Content="Normal checkbox"/> </StackPanel>

    【讨论】:

    • 哈哈。事实上,我从来没有想过组合框可能有一个合适的属性来实现这种行为。非常感谢!
    【解决方案2】:

    您实际上不必为每个停靠面板命名它们或事件处理程序。

    您可以对所有这些停靠面板使用相同的事件处理程序,并且在您的事件处理程序中,您可以使用发送者而不是名称。

    <StackPanel Orientation="Vertical">
            <DockPanel Tag="false" MouseUp="DockPanel_OnMouseUp">
                <CheckBox DockPanel.Dock="Left" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DockPanel}}, Path=Tag, Mode=TwoWay}"/>
                <Label DockPanel.Dock="Right" Content="CheckBox1" />
            </DockPanel>
            <DockPanel Tag="false" MouseUp="DockPanel_OnMouseUp">
                <CheckBox DockPanel.Dock="Left" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DockPanel}}, Path=Tag, Mode=TwoWay}"/>
                <Label DockPanel.Dock="Right" Content="CheckBox1"/>
            </DockPanel>
            <DockPanel Tag="false" MouseUp="DockPanel_OnMouseUp">
                <CheckBox DockPanel.Dock="Left" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DockPanel}}, Path=Tag, Mode=TwoWay}"/>
                <Label DockPanel.Dock="Right" Content="CheckBox1"/>
            </DockPanel>
            <DockPanel Tag="false" MouseUp="DockPanel_OnMouseUp">
                <CheckBox DockPanel.Dock="Left" IsChecked="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DockPanel}}, Path=Tag, Mode=TwoWay}"/>
                <Label DockPanel.Dock="Right" Content="CheckBox1"/>
            </DockPanel>
        </StackPanel>
    

    代码:

    private void DockPanel_OnMouseUp(object sender, MouseButtonEventArgs e)
        {
            var dockPanel = (DockPanel) sender;
            dockPanel.Tag = !dockPanel.Tag.ToString().ToLower().Equals("true");
        }
    

    【讨论】:

      猜你喜欢
      • 2014-06-22
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多