none
如果用WPF画了100多个相同形状的图形,那我怎么根据某一个传过来的的数字让相应的图形填充颜色 RRS feed

  • 问题

  • 在做一个工业管道故障检测的项目,需要绘制一个拉长的S型管道,然后管道要分成150节,想根据传过来的数字,让相应的某一节管道填充变红,其他的地方依然保持灰色或者白色即可
    2018年10月6日 8:23

全部回复

  • 使用值轉換器, ex:

    <Window x:Class="ValueConverterSample001.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:ValueConverterSample001"
            xmlns:con="clr-namespace:ValueConverterSample001.Converters"
            xmlns:vm="clr-namespace:ValueConverterSample001.ViewModels"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Window.DataContext >
            <vm:MainViewModel />
        </Window.DataContext>
        <Window.Resources >
            <con:NumberColorConverter x:Key="colorConverter"/>
        </Window.Resources>
        <StackPanel>
             <TextBlock FontSize="16" Margin="16" Text="{Binding Number}"
                       Foreground="{Binding Number, 
                       Converter={StaticResource colorConverter}}" />
        </StackPanel>
    </Window>
    
    Value Converter :
        public class NumberColorConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                if (value is null) return new SolidColorBrush(Colors.Blue);
                var v = (int)value;
                if (v < 100)
                { return new SolidColorBrush(Colors.Blue); }
                else if (v > 1000)
                { return new SolidColorBrush(Colors.Coral); }
                else
                { return new SolidColorBrush(Colors.Green); }
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }



    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2018年10月6日 9:02

  • Hi  SJTU Jason,

    >>在做一个工业管道故障检测的项目,需要绘制一个拉长的S型管道,然后管道要分成150节,想根据传过来的数字,让相应的某一节管道填充变红,其他的地方依然保持灰色或者白色即可

    Bill Chung 提供的思路是一个很好的解决方案。 

    通常,在WPF的绑定中,可以使用值转换器将值从一种类型转换成另外一种类型。值转换器必须实现IValueConverter接口的Convert和ConvertBack方法。 


    Convert和ConvertBack方法的区别是:Convert方法表示从绑定数据源到绑定目标的值转换,ConvertBack方法表示从绑定目标到绑定数据源的值转换。因此,如果绑定模式是一次性绑定或单向绑定,只需要在Convert方法的实现中完成值转换的工作即可;如果是双向绑定,就需要同时在Convert和ConvertBack方法的实现中完成值转换的工作

    绑定的值实现INotifyPropertyChanged接口,这样,只要对应的数字值改变,你对应的管道颜色会自动的呈现在UI上。

    Best Regards,

    Yong Lu

    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    2018年10月9日 3:16
    版主