WPF中如何给文本添加下划线

3
我有一个WPF用户控件,其中包含一个文本框。我可以设置文本是否下划线删除线
我认为我的代码有问题,特别是在取消设置部分,因为它并不总是正常工作...可能会删除一些带有下划线的元素?......
当多次将相同属性设置为相同值时,它会不断添加...
private void UpdateUnderline()
{
    if (this.IsUnderline)
    {
        this.MyTextBlock.TextDecorations.Add(TextDecorations.Underline);
    }
    else
    {
        foreach (var item in TextDecorations.Underline)
        {
            this.MyTextBlock.TextDecorations.Remove(item);
        }
    }
}

private void UpdateStrikethrough()
{
    if (this.IsStrikethrough)
    {
        this.MyTextBlock.TextDecorations.Add(TextDecorations.Strikethrough);
    }
    else
    {
        foreach (var item in TextDecorations.Strikethrough)
        {
            this.MyTextBlock.TextDecorations.Remove(item);
        }
    }
}

由于我无法完成

this.MyTextBlock.TextDecorations.Contains(TextDecorations.Strikethrough);

它不断地添加、再添加,所以当它移除时……它仍然存在 :)

例子:

<Window x:Class="WpfApplication10.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <CheckBox Content="Underline"
                      IsChecked="{Binding IsUnderline}" />
            <CheckBox Content="Strikethrough"
                      IsChecked="{Binding IsStrikethrough}" />
            <TextBlock Name="MyTextBlock"
                       Text="Quick Brown Fox Jumps Over The Lazy Dog." />
            <Button Content="Underline" Name="Underline" Click="Underline_Click"/>
            <Button Content="Strikethrough" Name="Strikethrough" Click="Strikethrough_Click"/>
            <Button Content="NO Underline" Name="NoUnderline" Click="NoUnderline_Click"/>
            <Button Content="NO Strikethrough" Name="NoStrikethrough" Click="NoStrikethrough_Click" />
        </StackPanel>
    </Grid>
</Window>

cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        DataContext = this;
    }

    private Boolean _IsUnderline;
    public Boolean IsUnderline
    {
        get
        {
            return _IsUnderline;
        }
        set
        {
            _IsUnderline = value;
            UpdateUnderline();
        }
    }
    private Boolean _IsStrikethrough;
    public Boolean IsStrikethrough
    {
        get
        {
            return _IsStrikethrough;
        }
        set
        {
            _IsStrikethrough = value;
            UpdateStrikethrough();
        }
    }

    private void UpdateUnderline()
    {
        if (this.IsUnderline)
        {
            this.MyTextBlock.TextDecorations.Add(TextDecorations.Underline);
        }
        else
        {
            foreach (var item in TextDecorations.Underline)
            {
                this.MyTextBlock.TextDecorations.Remove(item);
            }
        }
    }

    private void UpdateStrikethrough()
    {
        if (this.IsStrikethrough)
        {
            this.MyTextBlock.TextDecorations.Add(TextDecorations.Strikethrough);
        }
        else
        {
            foreach (var item in TextDecorations.Strikethrough)
            {
                this.MyTextBlock.TextDecorations.Remove(item);
            }
        }
    }

    private void Underline_Click(object sender, RoutedEventArgs e)
    {
        IsUnderline = true;
    }

    private void Strikethrough_Click(object sender, RoutedEventArgs e)
    {
        IsStrikethrough = true;
    }

    private void NoUnderline_Click(object sender, RoutedEventArgs e)
    {
        IsUnderline = false;
    }

    private void NoStrikethrough_Click(object sender, RoutedEventArgs e)
    {
        IsStrikethrough = false;
    }
}

你为什么要在if语句的非真块上使用for each循环? - Nate
2
@Nate:因为这就是生活 :) ... 我不知道其他的了。 - serhio
2个回答

2

"脏"解决方案:

    private void UpdateUnderline()
    {
        if (this.IsUnderline)
        {
            foreach (var item in TextDecorations.Underline)
            {
                this.MyTextBlock.TextDecorations.Remove(item);
            }
            this.MyTextBlock.TextDecorations.Add(TextDecorations.Underline);
        }
        else
        {
            foreach (var item in TextDecorations.Underline)
            {
                this.MyTextBlock.TextDecorations.Remove(item);
            }
        }
    }

0

我重新创建了它,现在正常工作:

创建过程:

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Height="350"
        Width="525">
    <Grid>
        <StackPanel>
            <CheckBox Content="Underline"
                      IsChecked="{Binding IsUnderline}" />
            <CheckBox Content="Strikethrough"
                      IsChecked="{Binding IsStrikethrough}" />
            <TextBlock Name="MyTextBlock"
                       Text="Quick Brown Fox Jumps Over The Lazy Dog." />
        </StackPanel>
    </Grid>
</Window>

代码后台:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        DataContext = this;
    }

    private Boolean _IsUnderline;
    public Boolean IsUnderline
    {
        get
        {
            return _IsUnderline;
        }
        set
        {
            _IsUnderline = value;
            UpdateUnderline();
        }
    }
    private Boolean _IsStrikethrough;
    public Boolean IsStrikethrough
    {
        get
        {
            return _IsStrikethrough;
        }
        set
        {
            _IsStrikethrough = value;
            UpdateStrikethrough();
        }
    }

    private void UpdateUnderline()
    {
        if (this.IsUnderline)
        {
            this.MyTextBlock.TextDecorations.Add(TextDecorations.Underline);
        }
        else
        {
            foreach (var item in TextDecorations.Underline)
            {
                this.MyTextBlock.TextDecorations.Remove(item);
            }
        }
    }

    private void UpdateStrikethrough()
    {
        if (this.IsStrikethrough)
        {
            this.MyTextBlock.TextDecorations.Add(TextDecorations.Strikethrough);
        }
        else
        {
            foreach (var item in TextDecorations.Strikethrough)
            {
                this.MyTextBlock.TextDecorations.Remove(item);
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接