【问题标题】:On mouse click strikethrough Button鼠标点击删除线按钮
【发布时间】:2013-01-31 09:59:03
【问题描述】:

我有一个带有 3 个按钮的 WrapPanel。

<WrapPanel Orientation="Horizontal">
   <Button Content="Book1" />
   <Button Content="Book2" />
   <Button Content="Book3" />
</WrapPanel>

如果我单击 Book1,我会看到 Book1 的内容。如果我点击 Book2,我会看到 Book2 等的内容。如果我点击它,是否有任何命令可以删除按钮?在 Html 中,文本有“del”:

<del>Strikethrough</del>

我想要同样的,但在 wpf 和按钮中

谢谢

【问题讨论】:

    标签: wpf xaml button


    【解决方案1】:

    在点击事件中将TextDecoration对象添加到TextBlock.TextDecorations集合中(例如):

    XAML:

    <Button Click="Button_Click_1">
       <TextBlock>
           Book 1
       </TextBlock>
    </Button>
    

    和处理程序:

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
       // ... your logic
    
       var button = (Button)sender;
       var textBlock = (TextBlock)button.Content;
    
       // if decoration wasn't already inserted
       //
       if (!textBlock.TextDecorations.Any())
           textBlock.TextDecorations.Add(new TextDecoration { Location = TextDecorationLocation.Strikethrough });
     }
    

    更新:回答您的评论 - 最简单的方法

    XAML

    <Button x:Name="button1" Click="Button_Click_1">
                <TextBlock>
                    Book 1
                </TextBlock>
            </Button>
    
            <Button x:Name="button2" Click="Button_Click_2">
                <TextBlock>
                    Book 2
                </TextBlock>
            </Button>
    

    代码:

    private void SetStrikethrough(Button b, Boolean strikethrough)
            {
                var textBlock = (TextBlock)b.Content;
    
                if (strikethrough)
                {
                    if (!textBlock.TextDecorations.Any())
                        textBlock.TextDecorations.Add(
                            new TextDecoration { Location = TextDecorationLocation.Strikethrough });
                }
                else
                {
                    textBlock.TextDecorations.Clear();
                }
            }
    
            private void Button_Click_1(object sender, RoutedEventArgs e)
            {
                var button = (Button)sender;
                SetStrikethrough(button1, true);
                SetStrikethrough(button2, false);
            }
    
            private void Button_Click_2(object sender, RoutedEventArgs e)
            {
                var button = (Button)sender;
                SetStrikethrough(button2, true);
                SetStrikethrough(button1, false);
            }
    

    请注意,此代码始终假定按钮内容是文本块。只是为了简单。

    【讨论】:

    • 这几乎就是我想要做的。但是,如果我点击第二个按钮(Book2),那么“删除线”也会留在按钮 1(Book1)中。
    • 您的所有按钮上都有一个事件处理程序或不同的(每个 1 个)?
    • 我首先为所有按钮尝试了 Button_Click_1。比我为每个按钮多创建 2 个。如果我点击按钮,删除线不会从之前点击的按钮中消失
    • 没问题 :) 然后将其标记为答案。
    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2013-12-12
    • 2015-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多