【问题标题】:Toggle the checkbox status when double click in WPF在 WPF 中双击时切换复选框状态
【发布时间】:2019-09-23 17:19:21
【问题描述】:

在 WPF 中创建了一个简单的复选框。 单击可切换 UI 中的复选框状态。 我希望在双击复选框文本时更改复选框状态。请帮我写下下面的代码。

xaml 中唯一的控件:

<Grid>
    <CheckBox Content="CheckBox" HorizontalAlignment="Left" Height="60" Margin="144,93,0,0" VerticalAlignment="Top" Width="392"/>
</Grid>

【问题讨论】:

  • 您不想一键更改状态?
  • 嗨,是的,我希望单击和双击时更改状态。

标签: wpf checkbox double-click mouseclick-event


【解决方案1】:

我找不到使用标准 CheckBox Control 的解决方案。我已经通过 UserControl 创建了自己的复选框。

DoubleClickCheckBox.xaml(用户控件)

<Grid VerticalAlignment="Center" HorizontalAlignment="Center" Loaded="Grid_Loaded">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <CheckBox Name="checkBox" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked"/>
    <TextBlock Name="textBlock" MouseDown="TextBlock_MouseDown" TextAlignment="Center" Grid.Column="1" Margin="4,0,4,0"/>
</Grid>

DoubleClickCheckBox.xaml.cs(用户控件)

public partial class DoubleClickCheckBox : UserControl
{
    public string Text { get; set; }

    public bool IsChecked { get; set; }

    public event EventHandler UserControlChecked;

    public event EventHandler UserControlUnChecked;

    public DoubleClickCheckBox()
    {
        InitializeComponent();
    }

    private void Grid_Loaded(object sender, RoutedEventArgs e)
    {
        this.checkBox.IsChecked = this.IsChecked;
        this.textBlock.Text = this.Text;
    }

    private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if(e.ClickCount == 2)
            this.checkBox.IsChecked = !this.checkBox.IsChecked;
    }

    private void CheckBox_Checked(object sender, RoutedEventArgs e)
    {
        if (UserControlChecked != null)
            UserControlChecked(this, EventArgs.Empty);
    }

    private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
    {
        if (UserControlUnChecked != null)
            UserControlUnChecked(this, EventArgs.Empty);
    }
}

MainWindow.xaml

<Grid>
    <local:DoubleClickCheckBox VerticalAlignment="Center" HorizontalAlignment="Center" Background="Aqua" Text="Test" IsChecked="False" UserControlChecked="DoubleClickCheckBox_UserControlChecked" UserControlUnChecked="DoubleClickCheckBox_UserControlUnChecked"/>
</Grid>

MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void DoubleClickCheckBox_UserControlChecked(object sender, EventArgs e)
    {
        this.Title = "Checked";
    }

    private void DoubleClickCheckBox_UserControlUnChecked(object sender, EventArgs e)
    {
        this.Title = "UnChecked";
    }
}

您可以使用此样式自定义所有内容。我只自定义了选中和未选中的事件。未来取决于你。

编辑:按照帖子所有者的要求,我再次启用了单击。 移除 CheckBox_PreviewMouseButtonDown 事件。

【讨论】:

  • 谢谢。这可以根据我的需要完美运行。但此外,我还希望单击状态切换。所以,无论是双击还是单击,我都希望状态改变。
  • 我们唯一需要改变的是 CheckBox_PreviewMouseButtonDown 事件。我在此事件中禁用了单击。我要编辑解决方案。
【解决方案2】:

如果您只想在双击时切换复选框状态,则只需创建一个 CheckBox_MouseDoubleClick 事件并将 IsChecked 属性设置为 true。但请注意,此解决方案不属于 MVVM 模式。

【讨论】:

  • 通过用户输入检查或取消检查是视图责任。因此处理这样的事件不会违反任何 mvvm 规则。如果有这样的事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2012-07-20
  • 2016-10-22
  • 1970-01-01
相关资源
最近更新 更多