【问题标题】:Highlight all text blocks that have the same text突出显示具有相同文本的所有文本块
【发布时间】:2019-01-17 17:56:02
【问题描述】:

我有一个相当复杂的表单,其中包含几个文本块。我想为这些块添加一个绑定,以便当鼠标悬停在它们上面时,所有其他文本与我悬停在上面的运行匹配的块都会突出显示。

如果您选择了一个单词,这与您在 Visual Studio 或 notepad++ 中看到的效果相同(所有相同的单词都会在编辑器窗口中突出显示)。

这是我目前所拥有的:

class TestViewModel
{
    public string TextToMatch { get; set; }
}

public partial class Test : UserControl
{
    TestViewModel _viewModel;
    public Test()
    {
        _viewModel = new TestViewModel();
        DataContext = _viewModel;
        InitializeComponent();
    }

    private void Test_MouseEnter(object sender, MouseEventArgs e)
    {
        var text = ((TextBlock)sender).Text;
        _viewModel.TextToMatch = text;
    }

    private void Test_MouseLeave(object sender, MouseEventArgs e)
    {
        _viewModel.TextToMatch = "";
    }
}

部分 XAML:

    <StackPanel>
        <TextBlock
            Name="Test1"
            Background="{Binding TextToMatch Converter={StaticResource converter}}"
            MouseEnter="Test_MouseEnter"
            MouseLeave="Test_MouseLeave">
            This matches
        </TextBlock>
        <TextBlock
            Name="Test2"
            Background="{Binding TextToMatch Converter={StaticResource converter}}"
            MouseEnter="Test_MouseEnter"
            MouseLeave="Test_MouseLeave">
            This matches
        </TextBlock>
        <TextBlock
            Name="Test3"
            Background="{Binding TextToMatch Converter={StaticResource converter}}"
            MouseEnter="Test_MouseEnter"
            MouseLeave="Test_MouseLeave">
            Some other text
        </TextBlock>
        <TextBlock
            Name="Test4"
            Background="{Binding TextToMatch Converter={StaticResource converter}}"
            MouseEnter="Test_MouseEnter"
            MouseLeave="Test_MouseLeave">
            This matches
        </TextBlock>
        <TextBlock
            Name="Test5"
            Background="{Binding TextToMatch Converter={StaticResource converter}}"
            MouseEnter="Test_MouseEnter"
            MouseLeave="Test_MouseLeave">
            Some other text
        </TextBlock>
    </StackPanel>

似乎很清楚,我需要一个用于这些绑定的值转换器。那不是问题。问题是如何将每个文本块的当前文本值获取到值转换器,以便它可以执行必要的文本比较并输出正确的背景颜色。

我该怎么做呢?或者有没有更好的方法我没有想到?

【问题讨论】:

    标签: c# wpf mvvm data-binding valueconverter


    【解决方案1】:

    为此,您需要 IMultiValueConverterMultiBinding

    注意:您可能需要调整转换器以更好地满足您的需求

    选项 1
    缺点:您也必须返回“默认”背景

    转换器:

    public class DistinctBrushMultiValueConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            if (values.Distinct().Count() == 1)
            {
                return Brushes.Orange; //Brush you want for highlight 
            }
    
            return null; //Or your default Brush
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    用法:

    <TextBlock
        Name="Test1"
        MouseEnter="Test_MouseEnter"
        MouseLeave="Test_MouseLeave">
        <TextBlock.Background>
            <MultiBinding Converter="{StaticResource DistinctBrushMultiValueConverter}">
                <Binding Path="TextToMatch" />
                <Binding RelativeSource="{RelativeSource Self}" Path="Text" />
            </MultiBinding>
        </TextBlock.Background>
        This matches
    </TextBlock>
    

    选项 2:Style 中使用 Trigger

    转换器:

    public class DistinctValuesMultiValueConverter : IMultiValueConverter
    {
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            return values.Distinct().Count() == 1;
        }
    
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    风格:

    <Style x:Key="HighlightTextBlockStyle" TargetType="{x:Type TextBlock}">
        <Style.Triggers>
            <DataTrigger Value="True">
                <DataTrigger.Binding>
                    <MultiBinding Converter="{StaticResource DistinctValuesMultiValueConverter}">
                        <Binding Path="TextToMatch" />
                        <Binding Path="Text" RelativeSource="{RelativeSource Self}" />
                    </MultiBinding>
                </DataTrigger.Binding>
                <DataTrigger.Setters>
                    <Setter Property="Background" Value="Orange" />
                </DataTrigger.Setters>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    

    用法:

    <TextBlock
        Name="Test1"
        MouseEnter="Test_MouseEnter"
        MouseLeave="Test_MouseLeave"
        Style="{StaticResource HighlightTextBlockStyle}">
        This matches
    </TextBlock>
    

    选项 3(仅供参考)::您也可以使用Behavior

    【讨论】:

    • 我实际上只是将所有我想点亮的文本块放入代码后面的列表中。
    猜你喜欢
    • 2021-05-28
    • 1970-01-01
    • 2011-11-10
    • 2013-08-14
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多