Подчеркните текст в WPF - PullRequest
       1

Подчеркните текст в WPF

3 голосов
/ 17 декабря 2010

У меня есть пользовательский контроль WPF с TextBox. Я установил текст Underline или нет, Strikethrough или нет.

Я думаю, что с моим кодом что-то не так, особенно unset part, потому что он не работает должным образом каждый раз ... возможно, некоторые элементы подчеркивания удаляются зачеркнутым? ...

Особенно, если несколько раз присваивать одному и тому же свойству одно и то же значение, оно добавляет и добавляет ....

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

Ответы [ 2 ]

2 голосов
/ 17 декабря 2010

«грязный» раствор:

    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 голосов
/ 17 декабря 2010

Я воссоздал его и отлично работает:

Отдых:

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);
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...