隧道Dockpanel Mousedown事件到WPF中的复选框

时间:2015-04-07 10:11:58

标签: wpf templates checkbox styles

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

2 个答案:

答案 0 :(得分:2)

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

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>

答案 1 :(得分:0)

您不必为每个停靠窗口命名它们或事件处理程序。

您可以为所有这些dockpanel使用相同的事件处理程序,并且在您的事件处理程序中,您可以使用发件人而不是名称。

<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");
    }